如何处理从Java迁移到Kotlin的泛型边界?

时间:2017-11-26 05:52:15

标签: generics kotlin

我的目标是让接口方法接受实现的类类型。这是我到目前为止编写的代码:

192.168.1.107

1 个答案:

答案 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 approachclass 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解决方法,但它不一定是类型安全的。