我是一名新的 Kotlin 程式員,我遇到了與泛型有關的問題
在以下代碼中,我收到it.get(this)“型別不匹配。必需:無。找到:任何。
inline fun <reified T : Any> Any.getPropertiesWithType() =
this::class.memberProperties
.filter { it.returnType.isSubtypeOf(T::class.starProjectedType) }
.map {
it.isAccessible = true
it.get(this) as T
}
這很令人困惑,因為memberProperties回傳 a Collection<KProperty1<T, *>>where T 是 的型別this,Any在我的情況下。KProperty1.get()接受一個相同型別 T 的引數,所以我希望Any可以毫無問題地傳遞。
我注意到的一件事是,it過濾器和地圖都是型別KProperty<out Any, *>>,但memberProperties沒有輸出方差。
如果我替換this::class為this.javaClass.kotlin,它可以正常作業,但這似乎是一種非常糟糕的方法。
如果有人知道解決此問題的方法或完全不同的策略,將不勝感激。我是 Kotlin 的新手,有時仍然以 Java 的方式做事。
uj5u.com熱心網友回復:
this::class類似于this.getClass()在 Java 中,它回傳一個KClass<out Any>(Class<? extends Object>在 Java 中)。畢竟,僅僅因為 的型別this是Any,它的運行時型別可能不是Any- 它可能是Any. out Any抓住了這個想法。
因此,memberPropertiesofthis::class將是 的集合KProperty1<out Any, *>。
MutableList<out Any>就像你不能在using中添加任何東西一樣,你也不能對 aadd的get值進行KProperty1<out Any, *>標記 - 輸入引數的型別out。考慮這一點的另一種方法是,該屬性可以在 的任何子類上Any,嘗試使用 來獲取該屬性this,這只是一個Any,顯然不起作用。
我會將未經檢查的演員移至it:
(it as KProperty1<Any, T>).get(this)
至于為什么.javaClass起作用,那是因為javaClass實際上給了你一個Class<Any>,而不是Class<out Any>。IMO,這沒有多大意義,但事實就是如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/426683.html
上一篇:初識MySQL資料庫
下一篇:使用打字稿創建物件中鍵的聯合物件
