我是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>() {
}
我能用某种正确的语法解决这类问题吗?我想我做错了吗?有人可以帮忙吗?
答案 0 :(得分:3)
您正在做的事情不正确,因为它允许以下代码:
val test: Test<Int> = B().getText()
B().getText()
尝试返回Test1()
,即Test<String>
。但因为返回类型可以是任何东西,它的有效性。这打破了类型系统。
答案 1 :(得分:3)
这是您正在寻找的答案:
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
答案 2 :(得分:2)
由于Kiskae的例子,你可能想要从类而不是方法强制执行类型。
例如:
abstract class A<T> {
abstract fun getText() : Test<T>
}
可以使用
进行扩展class B : A<String>() ...
将匹配Test1