【问题标题】:Static function not visible in kotlin when extended from java从 java 扩展时,静态函数在 kotlin 中不可见
【发布时间】:2019-07-30 13:06:23
【问题描述】:

我在一个 Android 项目中与 java 一起编写 Kotlin,我有一个抽象的 Java BaseApplication 类,它有一些静态方法,我的每种风格的 Application 类都扩展了这个 BaseApplication 类(称为 App.kt)并用 Kotlin 编写.我想知道为什么我不能通过 Kotlin 代码中的 App 类访问 BaseApplication 静态函数


public abstract class BaseApplication extends Application {
    public static void staticFunction(){
        Log.d("TAG", "some log...");
    }
}
public class App : BaseApplication() {
    fun doSomething(){
        Log.w("TAG", "doing something")
    }

我可以从 Java 类调用 App.staticFunction(),但不能从 Kotlin 类调用它。难道我做错了什么?为什么我不能调用 App.staticFunction() ?有什么不同?

我可以通过 java 做到这一点:

public class JavaTest {
    public void main(String[] args) {
        App.staticFunction();
    }
}

但这(kotlin)给了我编译错误:

class KotlinTest {
    fun main(args: Array<String>) {
        App.staticFunction()  //unresolved reference: static function
    }
}

(我知道我可以通过AbstractApplication访问staticFunction,我只想知道为什么我不能通过App类访问它?)

【问题讨论】:

标签: java android kotlin


【解决方案1】:

来自Kotlin documentation on Java interop

Java 类的静态成员为这些对象形成“伴生对象” 类。我们不能将这样的“伴侣对象”作为值传递, 但可以显式访问成员...

您的 App 类是 Kotlin 类,对静态方法一无所知。但是,应该有一个为 BaseApplication Java 类上的静态方法创建的伴随对象。所以你应该可以调用静态方法

BaseApplication.staticFunction()

【讨论】:

    【解决方案2】:

    你可以轻松使用

    public class App : BaseApplication() {
        fun doSomething(){
            Log.w("TAG", "doing something")
            BaseApplication.staticFunction()
        }
    
       override fun onCreate() {
           super.onCreate()
           staticFunction() // you can call without problem
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2020-07-25
      • 2015-04-02
      • 2015-07-05
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多