我正在嘗試在 a 中使用泛型when,但如果我嘗試復制接收到的引數,則會出現編譯錯誤。下面的代碼舉例說明了這個問題。
abstract class A { abstract val prop: String};
data class B(override val prop: String) : A();
fun <T : A> execute(t: T): T {
return when (t) {
is B -> {
t.copy() // doesn't compile
// t.copy() as T // compiles
}
else -> t
}
}
如果我嘗試不進行強制轉換,我得到的編譯錯誤是:
error: type mismatch: inferred type is Line_19.B but T was expected
為什么編譯器無法判斷型別是否一致?有沒有辦法避免鑄造?
uj5u.com熱心網友回復:
我認為編譯器不夠聰明的原因是因為它將資料類視為任何其他類。特別是,它將資料類視為可以具有子類。請考慮以下示例:
open class B(override val prop: String) : A() {
fun copy() = B(prop)
}
data class C(override val prop: String) : B(prop)
使用你的相同execute現在會在實體上引發例外C,因為你不能轉換為Tsince TisC但copy()回傳一個B
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511216.html
標籤:科特林仿制药
上一篇:如何使用系結值/型別引數圍繞組件制作包裝器?在mudblazormudselect
下一篇:有沒有辦法用泛型型別編譯?
