代码之家  ›  专栏  ›  技术社区  ›  James Busby

扩展Kotlin基类的Java类不能调用基类的内部方法

  •  1
  • James Busby  · 技术社区  · 6 年前

    我在Android上尝试Kotlin,androidstudio,把它和一些现有的Java代码混合在一起,我遇到了一个问题。

    我在Kotlin中有一个基类,其中一个方法被标记为 internal :

    package com.example.kotlin.hellokotlin
    
    open class KotlinBaseClass
    {
        internal fun doSomething()
        {
            println("Done something!")
        }
    }
    

    然后创建一个扩展 KotlinBaseClass

    package com.example.kotlin.hellokotlin
    
    class KotlinDerivedClass : BaseClass()
    {
        fun doSomethingElse()
        {
            doSomething()
            println("Done something else!")
        }
    }
    

    这个编译和工作良好。

    如果我现在创建一个Java类 KotlinBaseClass公司 相反,其功能与 KotlinDerivedClass

    package com.example.kotlin.hellokotlin;
    
    public class JavaDerivedClass extends KotlinBaseClass
    {
        public void doSomethingElse()
        {
            doSomething();
            System.out.println("Done something else!");
        }
    }
    

    我发现这个类不会编译,因为 doSomething() 无法解析。如果我移除 内部的 声明中的关键字 剂量测定法() 在里面 KotlinBaseClass公司

    这是预期的行为吗?Java和Kotlin之间的互操作性存在一个已知问题?

    1 回复  |  直到 6 年前
        1
  •  2
  •   leonardkraemer    6 年前

    https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

    内部声明在Java中是公开的。内部类的成员会经历名称损坏,这使得不小心从Java中使用它们变得更加困难,并且根据Kotlin规则,允许具有相同签名但彼此看不到的成员重载;

    alt + space 自动完成。Java类中函数的全名是 doSomething$nameOfYourModule

    或者您可以设置 doSomething protected 并以其正常名称访问它。