[英]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.