簡體   English   中英

Kotlin-具有通用返回類型的抽象函數

[英]Kotlin - abstract function with generic return type

我是Kotlin的新手,真的很擔心我是否在編寫正確的語法。 我有一個超類,我想編寫如下的通用抽象函數。

abstract class A {
    abstract fun <T> getText() : Test<T>
}

class B : A() {
    override fun <T> getText(): Test<T> {
        return Test1() // Error - Required Test<T>, found Test1
    }
}

class C : A() {
    override fun <T> getText(): Test<T> {
        return Test2() // Error - Required Test<T>, found Test2
    }
}

class Test1 : Test<String>() {

}

class Test2 : Test<Int>() {

}

我可以用某種適當的語法解決此類問題嗎? 我想我做錯了嗎? 有人可以幫忙嗎?

您正在執行的操作是不正確的,因為它將允許以下代碼:

val test: Test<Int> = B().getText()

B().getText()嘗試返回Test1() ,即Test<String> 但是因為返回類型可以是任何東西,所以它是有效的。 這破壞了類型系統。

這是您要尋找的答案:

abstract class A<T> {
    abstract fun getText() : Test<T>
}

class B : A<String>() {
    override fun getText(): Test<String> = Test1()
}

class C : A<Int>() {
    override fun getText(): Test<Int> = Test2()
}

class Test1 : Test<String>()
class Test2 : Test<Int>()
open class Test<T>

您只需要將參數T從方法簽名移至類。

獎勵:我將以上代碼片段更新為更慣用的Kotlin

由於Kiskae的示例,您可能想從類而不是方法中強制執行類型。

例如:

abstract class A<T> {
    abstract fun getText() : Test<T>
}

可以使用擴展

class B : A<String>() ...

它將與Test1的類型匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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