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

我的目标是让接口方法接受实现的类types。 这是我迄今写的代码:

internal interface Diff { //in Java I was using  fun lessThan(other: Diff): Boolean } private class ADiff(private val value: Int) : Diff { override fun lessThan(other: ADiff): Boolean { return value < other.value } } //B can now accept even int types which is not desired private class BDiff(private val value: Int) : Diff { override fun lessThan(other: Int): Boolean { return value < other } } 

在Java中“工作”的原因是因为使用原始types Diff 。 不要这样做!


您可以得到最接近的是使用递归types绑定:

 interface Diff> { fun lessThan(other: T): Boolean } 

问题是,你可以替换任何其他的Difftypes。

但是, 使用 Diff ,请使用通用types约束T : Diff

 fun > diffUser(diff1: T, diff2: T) { println(diff1.lessThan(diff2)) } 

任何不执行Diff都不会被接受。

例:

 class CDiff(private val value: Int) : Diff { // <-- Wrong type! override fun lessThan(other: DDiff) = value < other.value } class DDiff(val value: Int) : Diff { 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)) } 

Comparable类使用相同的方法 。


虽然这是有效的,但是你真正想要的是一种“自我types” ,虽然它在某一点上处于路线图上,但是这不被支持 。 我相信JetBrains拒绝了这个请求,虽然我找不到错误报告。

这个答案详细介绍了Java中使用CRT模式的解决方法,尽管它不一定是types安全的。