这可行:
class Generic<T, R>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
但是参数R应该不是类签名的一部分.它仅在施工时有用.同样,泛型方法的类型参数与类的类型参数无关.
但是,这不起作用:
class Generic<T>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
这也不是:
class Generic<T><R>(thingy: R)
{
val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)
我没有在文档中找到答案.
这是不可能直接的.
但是,您可以使用工厂方法获得所需的结果:
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
})
Run Code Online (Sandbox Code Playgroud)
通常,工厂方法以小写字母开头(例如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
})
Run Code Online (Sandbox Code Playgroud)
正如@Alexey Romanow所指出的,Kotlin stdlib的部分使用了这种方法.
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |