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