如何解决Kotlin可为空的递归泛型边界如何?
我遇到了在Kotlin中尝试将3个概念组合在一起的问题:泛型,具有递归边界的泛型,可为空的泛型边界。这是代码:
class ClassA<T>(val field: T)
val OBJ1 = ClassA("1")
val OBJ2 = ClassA<String?>(null)
val OBJ3 = ClassA<String?>("3")
class ClassB<T: Comparable<T>>(val field: ClassA<T>) {
companion object {
val VALUES: Set<ClassB<*>> = setOf(ClassB(OBJ1),ClassB(OBJ2),ClassB(OBJ3))
}
}
表达式ClassB(OBJ2)
和ClassB(OBJ3)
无法编译,因为String? isn't a subtype of Comparable<String?>
有人知道此问题的解决方法吗?我尝试了T: Comparable<T?>
,T: Comparable<T>?
,T: Comparable<T?>?
。他们俩都不为我工作。
谢谢。
解决方法
首先,T
的上限必须为空,以使T
为空。
class ClassB<T: Comparable<T>?>(val field: ClassA<T>)
我认为String?
不是Comparable<String?>?
的子类型,因为String
本身不是Comparable<String?>
的子类型。我不知道如何解决这个问题。这就是他们定义String类的方式,因此您无法更改它。
如果创建一个String包装类,它将起作用:
class ClassA<T>(val field: T)
class String2(val value: String): Comparable<String2?> {
override fun compareTo(other: String2?): Int {
other ?: return 1
return value.compareTo(other.x)
}
}
val OBJ1 = ClassA(String2("1"))
val OBJ2 = ClassA<String2?>(null)
val OBJ3 = ClassA<String2?>(String2("3"))
class ClassB<T: Comparable<T>?>(val field: ClassA<T>) {
companion object {
val VALUES: Set<ClassB<*>> = setOf(ClassB(OBJ1),ClassB(OBJ2),ClassB(OBJ3))
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。