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