我的目标是让接口方法接受实现的类类型。这是我到目前为止编写的代码:
192.168.1.107
答案 0 :(得分:2)
这在Java中“起作用”的原因是因为<T extends Diff>
使用了raw type Diff
。不要这样做!
最接近的是使用递归类型绑定:
interface Diff<T : Diff<T>> {
fun lessThan(other: T): Boolean
}
问题是,您可以替换Diff
的任何其他子类型。
但是,当使用 Diff
时,请使用泛型类型约束T : Diff<T>
:
fun <T : Diff<T>> diffUser(diff1: T, diff2: T) {
println(diff1.lessThan(diff2))
}
并且不会接受任何未实现Diff
的{{1}}。
示例:
Diff<SameType>
This same approach由class CDiff(private val value: Int) : Diff<DDiff> { // <-- Wrong type!
override fun lessThan(other: DDiff) = value < other.value
}
class DDiff(val value: Int) : Diff<DDiff> {
override fun lessThan(other: DDiff) = value < other.value
}
fun test() {
diffUser(CDiff(3), CDiff(4)) // <-- Doesn't compile due to the generic constraint
diffUser(DDiff(3), DDiff(4))
}
类使用。
虽然这有效,但真正想要的是“自我类型”and this is not supported, although it was on the roadmap at some point。我相信JetBrains拒绝了这个请求,但我找不到错误报告。
This answer详细介绍了使用the CRT pattern的Java解决方法,但它不一定是类型安全的。