型別變數可以引用目前型別嗎?
在程式語言中,類型變數對於表達類型約束和多態性至關重要。然而,這些變數的使用方式存在限制。一個常見的問題是類型變數是否可以引用它所在的確切子類型。
考慮以下程式碼:
這裡,我們使用泛型方法定義一個類別 A foo() 接受型別參數 T。我們也定義了一個重寫方法 foo() 的子類別 B。問題是,foo() 中的型別參數 T 可以用來引用 B 類別中的確切子型別 B 嗎?
答案:
不幸的是,Java 確實可以不允許類型變數引用它們所在的確切子類型。上例中的類型變數 T 在 foo() 範圍內仍然是未知類型,並且不能解析為子類型 B。
奇怪的重複模板模式(自我類型):
要實現具有「自我」類型的所需行為,可以使用設計模式稱為Curiously Recurring Template ( CRT) 模式,也稱為「自型別」。此模式涉及定義抽象基類,這些基類強制執行傳回實例的執行時間類型的約定。衍生類別透過將類型參數解析為自己的類型來實作 self 類型。
以下是Java 中CRT 模式的範例:
雖然此模式提供了一種引用的方法目前類型使用self(),應謹慎使用,因為它會引入誤用的可能性並可能損害型別安全。
以上是Java 中類型變數可以引用自己的子類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!