繁体   English   中英

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

[英]Is it possible to reference a nested class from a subclass like in Java?

我正在与之交互的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类将在稍后移入Subclass 。这是我正在使用的外部约束。)

我不确定这是否解决了你的问题,买你可以从Subclass访问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()
}

此外,为了避免任何混淆,您可以创建一个创建Nested类的函数

class Subclass : Superclass() {

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

}

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

typealias MyNested = Superclass.Nested

并使用它像:

MyNested()

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

typealias MyNested = Subclass.Nested

这样,在删除Superclass时,您只需要一个需要调整代码的位置。

现在真的很遗憾,这两个类都不在你的控制之下,并且Java的这个特性在Kotlin中不起作用。 另一方面,我很高兴事实并非如此。 Subclass.Nested这样的东西,实际上没有任何这样的嵌套类,在我看来并不是很方便。 然而,这也是扩展功能的可能性......所以现在我处于冲突中;-)

正如评论中所说的那样:这可能只是一个错误。 我还没有找到任何消息来源,这是否是一个故意的设计决定。 这对我来说听起来不错,但这并不意味着它是故意的。 您可能想在Kotlin论坛中提出相同的问题或者打开一个问题并在此链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM