簡體   English   中英

Kotlin - 類型與泛型返回類型和子類不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM