2017-08-26 120 views
1

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

} 

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

回答

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

3

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

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

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

2

由于Kiskae的例子,您可能想要从类中强制执行类型而不是方法。

例如:

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

可以延长使用

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

这将匹配Test1