簡體   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