使用Kotlin在子类内部执行静态方法编译?

时间:2016-03-02 15:24:02

标签: java gradle kotlin

有没有办法可以在Kotlin的现有类中静态编译main()方法?我正在尝试让Gradle使用main()方法将其构建为应用程序,但我没有运气。我一直在尝试几种解决方法......

class MyApp: App() {

    override val primaryView = MyView::class

    companion object Launcher {
        @JvmStatic
        fun main(args: Array<String>): Unit {
            launch(*args)
        }
    }
}

在我的Gradle脚本中,我尝试指定MyApp类具有main()方法。当我拨打run时,它会出错,无法找到班级。

mainClassName = 'path.to.application.MyApp'

修改

我为这种混淆道歉,但我的问题的一部分可能与子类化有关,而不一定找到main()类。

main()函数需要访问launch()中定义的App方法。出于某种原因,companion关键字不允许这样做:/如果这些信息相关,我们可以重新考虑下注吗?

1 个答案:

答案 0 :(得分:3)

伴侣对象中的静态方法被放置在封闭类中。所以在你的情况下MyApp。无论您是否命名伴随对象,都是如此,并且在运行该类时无需以任何方式引用该伴随。

因此,假设以下情况属实,您的代码是正确的:

  1. 您已在Gradle中应用了应用程序插件
  2. 您将包含上述代码的软件包命名为path.to.application(您不显示软件包语句)
  3. 您收到path.to.application.MyApp的类未找到错误且匹配#2,(您没有显示Gradle的实际错误)
  4. 您正在运行正确的gradle任务(您正在运行哪个任务?)
  5. 代码实际上是编译的,查看你的最新评论表明你可能有一个编译器错误(launch()方法无法从同伴访问),这意味着你无法运行尚未编译的东西。
  6. 如果要检查类名,可以右键单击Intellij IDEA中的main()方法,然后选择刚刚运行/调试选项下方的create path.to.app...菜单选项,以及何时打开运行时配置对话框你可以在那里看到完整的类名。这应该与您的Gradle中使用的相同。如果您已经有运行时配置,只需在那里查看完整的类名。如果这不起作用,问题出在其他地方,你需要提供缺少的信息(什么是Gradle任务,什么是实际错误,什么是类的包语句)

    这个问题中缺少一些有助于缩小范围的信息。

    这个例子:

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

    在运行类org.test.kotlin.MyApp

    时工作正常

    这样做,没有单词Launcher

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

    这是偶然的,但是没有按照你的预期进行,而是创建一个嵌套类并在那里添加静态并使用类org.test.kotlin.MyApp.Launcher运行。如果这是有效的,那么问题是没有显示它正在使用的实际主类名失败:

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

    关于可能的编译器错误(上面的#5):在您的代码中,您引用了未显示的launch()方法,也许它位于祖先类中。但是你没有创建任何类的实例。因此编译错误会失败。将其更改为:

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

    这些其他相关问题也有类似的提示: