这样可行:
find
但是参数class Generic<T, R>(thingy: R)
{
val x = thingy.getX()
}
实际上不应该是类签名的一部分。它仅在施工时有用。通用方法的类型参数与类的类型参数无关。
然而,这不起作用:
R
这两个都没有:
class Generic<T>(thingy: R)
{
val x = thingy.getX()
}
我在documentation找不到答案。
答案 0 :(得分:6)
这是不可能的。
然而,您可以使用工厂方法获得所需的结果:
interface HasX<out V> {
val x: V
}
class Generic<T>(val x: Int) {
companion object {
fun <T, R : HasX<Int>> create(thingy: R) = Generic<T>(thingy.x)
}
}
val result: Generic<String> = Generic.create(object : HasX<Int> {
override val x: Int = 12
})
通常工厂方法以小写字母开头(例如mutableList
)没有什么能阻止你以不同的方式做事:
fun <T, X : HasX<Int>> Generic(thingy: X):Generic<T> = Generic(thingy.x)
val result: Generic<String> = Generic(object : HasX<Int> {
override val x: Int = 12
})
正如@Alexey Romanow部分所述,Kotlin stdlib使用this approach。