是否可以像Java中那样从子类中引用嵌套类?

时间:2019-06-03 22:20:40

标签: java kotlin

我正在与之交互的Java库具有以下内容:

class Superclass {
    static class Nested {}
}

class Subclass extends Superclass {}

这是Kotlin中的非法代码:

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}

编译器说Subclass.Nested是一个未解决的引用。但是,等效的Java代码也不是非法的:

class Test {
    Superclass.Nested thing1 = new Superclass.Nested();
    Subclass.Nested thing2 = new Subclass.Nested();
}

Kotlin中是否还有其他方法通过用子类而不是超类限定嵌套类来引用嵌套类?

(为什么?因为这里有一个不寻常的弃用方式:Superclass被弃用,并由Subclass取代。Nested类将被移到{{ 1}}。这就是我正在研究的外部约束。)

2 个答案:

答案 0 :(得分:3)

我不确定这是否可以解决您的问题,请购买可以从子类访问Nested类,因此可以执行以下操作:

open class Superclass {
    class Nested
}

class Subclass : Superclass() {

    companion object Nested {
        operator fun invoke(): Superclass.Nested = Nested()
    }

}

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}

此外,为避免混淆,您可以创建一个创建嵌套类的函数

class Subclass : Superclass() {

    companion object {
        fun createNested() = Nested()
    }

}

答案 1 :(得分:1)

由于您无法访问源代码或必须等待PR批准,因此我可能会改用typealias进行尝试,例如:

typealias MyNested = Superclass.Nested

并像这样使用它:

MyNested()

Superclass过时后,您只需要替换类型别名,例如:

typealias MyNested = Subclass.Nested

这样,删除Superclass时,您只有1个地方需要修改代码。

现在真的很遗憾,这两个类都不受您的控制,并且Java的此功能在Kotlin中不起作用。另一方面,我很高兴事实并非如此。当实际上没有此类嵌套类时,类似Subclass.Nested之类的东西在我看来并不十分方便。但是,扩展功能也是可以的...所以现在我陷入了冲突;-)

正如评论中所说:这可能还有可能是一个bug。无论这是不是故意的设计决定,我都没有找到任何资料。对我来说听起来不错,但这并不意味着它是故意的。您可能想在Kotlin forumsopen an issue中问同样的问题,并在此处链接。