¿Imponer una compilation de methods estáticos dentro de una subclass con Kotlin?

¿Hay alguna manera de que pueda comstackr un método main() estáticamente dentro de una class existente en Kotlin? Intento que Gradle cree esto como una aplicación con un método main() , pero no tengo suerte. He estado probando varias soluciones también …

 class MyApp: App() { override val primaryView = MyView::class companion object Launcher { @JvmStatic fun main(args: Array<String>): Unit { launch(*args) } } } 

En mi script de Gradle, estoy tratando de especificar que la class MyApp tiene un método main() . Sin embargo, se equivoca y no puede encontrar la class cuando llamo run .

 mainClassName = 'path.to.application.MyApp' 

EDITAR

Me disculpo por la confusión, pero parte de mi problema podría tener que ver con la creación de subclasss y no necesariamente encontrar la class main() .

La function main() necesita acceso al método launch() que se define en la App . Por alguna razón, poner la palabra key companion no permite esto: / ¿Podemos reconsiderar los votos abajo si esta información es relevante?

Un método estático en un object complementario se coloca en la class adjunta. Entonces en tu caso MyApp . Esto es cierto independientemente de que nombre el object complementario, y no necesita hacer reference al acompañante de ninguna manera al ejecutar la class.

Por lo tanto, su código es correcto, suponiendo que lo siguiente es cierto:

  1. Tienes el complemento de aplicación aplicado en tu Gradle
  2. Usted nombró su package que contiene el código anterior como path.to.application (no muestra la statement del package)
  3. path.to.application.MyApp error de class no encontrada para path.to.application.MyApp y coincide con # 2, (no muestra el error real de Gradle)
  4. Está ejecutando la tarea gradle correcta (¿qué tarea está ejecutando?)
  5. El código en realidad está comstackdo, ver sus últimos comentarios indica que probablemente tuvo un error de compilation launch() método launch() no es accesible desde el acompañante) lo que significaba que no podía ejecutar algo que aún no se había comstackdo.

Lo que puede hacer para verificar el nombre de class es hacer clic derecho en el método main() dentro de Intellij IDEA y seleccionar la opción de menu create path.to.app... que está justo debajo de las opciones de ejecución / debugging y cuando abre el dialog de configuration de time de ejecución puede ver el nombre de class completo allí. Ese debería ser el mismo que se usó en su Gradle. Si ya tiene una configuration en time de ejecución, simplemente vea el nombre de class completo allí. Si esto no funciona, el problema está en otra parte y debe proporcionar la información que falta (qué tarea Gradle, cuál es el error real, cuál es la statement del package para la class)

Parte de la información falta en la pregunta que ayudaría a networkingucir esto.

Este ejemplo:

 package org.test.kotlin class MyApp { companion object Launcher { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

Funciona bien al ejecutar la class org.test.kotlin.MyApp

También lo hace, sin la palabra Launcher :

 package org.test.kotlin class MyApp { companion object { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

Y esto funciona por crash, pero no está haciendo lo que esperaba, sino que está creando una class anidada y agregando la estática allí y ejecutándola usando la class org.test.kotlin.MyApp.Launcher . Si esto funciona, la pregunta no muestra el nombre de class principal real que está utilizando que está fallando:

 package org.test.kotlin class MyApp { object Launcher { @JvmStatic fun main(args: Array<String>) { println("hello") } } } 

Acerca de los posibles compiler errors (n. ° 5 arriba): en su código hace reference al método launch() que no muestra, tal vez está en la class antecesora. Pero no creaste una instancia de ninguna class. Entonces esto fallará con el error del comstackdor. Cambiar esto a:

 class MyApp: App() { override val primaryView = MyView::class companion object { @JvmStatic fun main(args: Array<String>): Unit { MyApp().launch(*args) } } } 

Consejos similares están en estas otras preguntas relacionadas:

  • Su pregunta sobre cómo ejecutar se responde en otra pregunta de SO: https://stackoverflow.com/a/26402542/3679676
  • ¿Cómo ejecutar la class Kotlin desde la línea de command?
  • cómo ejecutar un file de class comstackdo en Kotlin?
  • Escribir en parcer valor nulo en kotlin
  • ¿La mejor forma de combinar banderas enteras usando Kotlin?
  • Fragmento: Visibilidad relativa de la presentación no modificable en OnCreateView
  • kotlin y @Valid Spring anotación
  • Cómo usar el calificador 2 @Named de Dagger en Kotlin
  • Referencia no resuelta: T
  • ¿Podemos lograr security de tipo de time de compilation para una unión de types que no podemos controlar?
  • Kotlin y Dagger2
  • Agregar datos a arrayList de otra actividad
  • Declaración de object global en kotlin
  • Genéricos Java vs Kotlin