每個人!我有一些來自 Java 依賴項的類:
public class MyClass {
public MyClass copy() {
....
}
public void init() {
...
}
}
我想在我的 Kotlin 類中撰寫一個函式:
fun <T : MyClass> prepareListCopy(objects: List<T>?): List<T>? =
objects?.map { it.copy().apply { init() } }
我希望我的函式接受并回傳 MyClass 的子型別串列,但 IDE 向我顯示此錯誤: 將封閉函式 'KOtlinClass.prepareListCopy' 的回傳型別更改為 'List< MyClass >?'
如何在此函式中正確定義泛型?
uj5u.com熱心網友回復:
在您提供的定義中,MyClass.copy()回傳MyClass. 所以即使你有一個子型別(比如MySubClass)并且你打電話給MySubClass.copy()你,你仍然會得到 a MyClass,而不是 a MySubClass。
這就是為什么你不能說你的泛型函式回傳 a List<T>?,你必須說它回傳List<MyClass>?:
fun <T : MyClass> prepareListCopy(objects: List<T>?): List<MyClass>? =
objects?.map { it.copy().apply { init() } }
(這正是錯誤訊息告訴您的內容:D)
現在考慮到這個函式的作用,知道確切的意義已經沒有什么意義T了,你可以說你希望輸入串列包含MyClassusingList<out MyCLass>的子型別,并且函式不需要是通用的:
fun prepareListCopy(objects: List<out MyClass>?): List<MyClass>? =
objects?.map { it.copy().apply { init() } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/477672.html
上一篇:在JUnit5中,為什么postMethod會拋出TransactionSystemException而不是回傳帶有錯誤請求的ResponseEntity?
