Kotlin – 具有泛型返回类型的抽象函数

我是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>() { } 

我能用某种恰当的语法来解决这类问题吗? 我想我犯了一些错误? 任何人都可以帮忙吗?

这是你正在寻找的答案:

 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

你在做什么不能是正确的,因为它会允许下面的代码:

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

B().getText()试图返回Test1() ,这是Test<String> 。 但是因为返回类型可以是任何东西,所以它是有效的。 这打破了类型系统。

由于Kiskae的例子,您可能希望从类中而不是方法强制类型。

例如:

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

可以使用扩展

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

这将与Test1的类型相匹配