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
的类型相匹配