[英]Kotlin - type mismatch with generic return type and subclass
希望大家在這場大流行中保持健康:)
我可以用一些幫助來弄清楚我在這里做錯了什么,TIA! 另外,我對 Kotlin 有點陌生,如果這是一個愚蠢的問題,我很抱歉。
我正在嘗試擴展一個類並實現一個在 java 庫 (AndroidX) 中定義的接口。 但是,當我嘗試實現接口函數時,我的返回值出現類型不匹配錯誤。 由於我使用的是 AndroidX 庫中定義的接口,因此不能簡單地更改接口函數簽名以使其構建。
我基本上將這個其他 SO 答案轉換為 Kotlin: https : //stackoverflow.com/a/34398747/535638
開發機器/IDE 信息:Android Studio 3.6.1 Build #AI-192.7142.36.36.6241897,構建於 2020 年 2 月 26 日運行時版本:1.8.0_212-release-1586-b04 amd64 VM:JetBrain 的 OpenJDK 64 位服務器 VM sro Windows 8.1 6.3 GC:ParNew,ConcurrentMarkSweep 內存:1237M 核心:8 注冊表:ide.new.welcome.screen.force=true 非捆綁插件:org.jetbrains.kotlin,com.google.services.firebase
我試圖用下面的代碼概括這個錯誤,希望可以節省你在解決另一個 SO 問題時的一些努力,而且我在這個通用代碼中遇到了相同的編譯器錯誤。
open class LibraryClassA {
}
open class LibraryClassB {
val retval = LibraryClassA()
// this kotlin signature seems to be inferred/transcribed from java by the IDE/compiler
open fun <T : LibraryClassA?> foobar(): T? {
return null
}
}
class MyClass : LibraryClassB() {
override fun <T : LibraryClassA?> foobar(): T? {
return retval // compiler error on this line - type mismatch, Required T?, Found LibraryClassA
}
}
另一個答案解釋了編譯器錯誤背后的原因,但由於我無法輕松修改我正在使用的庫,因此我的問題的解決方案是進行強制轉換並取消警告。
我的最終代碼如下所示:
override fun <T : Preference?> findPreference(key: CharSequence): T? {
// unchecked cast needed since we can't modify the library code to call this with the
// correct type parameter, and we can't modify the function signature
@Suppress("UNCHECKED_CAST")
return this.preference as T
}
這里是根本問題。
當你寫
fun <T : LibraryClassA?> foobar(): T? { ... }
你宣布的調用者foobar
可以指定的任何子類LibraryClassA
他們想要的,得到的是一個實例。 例如,如果有
class FooClass : LibraryClassA() { ... }
有人可以打電話
val myFooClass: FooClass = myLibraryClassB.foobar<FooClass>()
並期望它起作用。 你不會為工作,因為什么什么,你將有將是一個LibraryClassA
實例,而不是一個FooClass
實例。
如果您的意圖是返回LibraryClassA?
某個子類LibraryClassA?
,但是LibraryClassB
的實現控制了他們得到的東西,而不是調用者,那么該函數的正確類型是
fun foobar(): LibraryClassA? { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.