我試圖在這里理解泛型并且正在苦苦掙扎。我有一個簡單的代碼,看起來像
interface A {
}
interface B {
}
class C : A, B {
}
fun <T: A> changeVal() : T {
return C()
}
我收到以下錯誤Type mismatch: inferred type is C but T was expected。我怎么了?
uj5u.com熱心網友回復:
您撰寫了一個函式,上面寫著“命名我的子類A。我將回傳該子類的實體。” 這個簽名是一個謊言,因為你總是回傳C(),它是一個C實體,而不是T所有T子類的a A。
泛型建立了“所有人”的關系。呼叫者總是決定泛型實體化到什么的人,而不是被呼叫者。在你的情況下,你只是想 return A。
fun changeVal() : A
您嘗試使用的功能稱為存在型別,它在 Kotlin 中不可用。在 Haskell(帶有適當的編譯器擴展)中,簽名可能類似于
data AContainer where
AVal :: forall a. a -> AContainer
changeVal :: AContainer
changeVal = ...
但是 Kotlin 沒有這個功能。事實上,這正是 OOP 語言中子型別化的目的:它說“我有一個具有這些特性的物件,但我不知道任何具體的東西”。所以你不需要泛型來表達這種模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449169.html
上一篇:如何在不知道確切型別的情況下在Rust中組合特征操作
下一篇:在通用類激活器上找不到建構式
