我试图从AbstractList派生一个具有上限可比性的委托类,并希望将列表用作可以包含空值的委托。以下是我的实现:
package org.baier.test
class MyList<out T: Comparable<@kotlin.UnsafeVariance T>>(private val delegate: List<T>) : AbstractList<T>() {
override val size = delegate.size
override fun get(index: Int): T {
return delegate[index]
}
}
fun main() {
val delegate1: List<Int> = listOf(1, 2, 3, 4, 5)
val list1 = MyList(delegate1)
val delegate2: List<Int?> = listOf(1, 2, 3, null, 4, 5)
val list2 = MyList(delegate2)
}
在main方法中,我尝试用List和List实例化类Mylist
“类型不匹配。必需:可比较
为什么是Int?不属于可比类型
Tenfour04已经提出了它不起作用的原因。
无论如何,如果您想让它也能与null一起工作,您可以尝试说您的列表是类型为<代码>列表
class MyList<out T: Comparable<@kotlin.UnsafeVariance T>(private val delegate: List<T?>, private val nullValuesProvider: (Int) -> T) : AbstractList<T>() {
override val size = delegate.size
override fun get(index: Int): T {
return delegate[index] ?: nullValuesProvide(index)
}
}
或者,也可以使用Null的默认值:
class MyList<out T: Comparable<@kotlin.UnsafeVariance T>(private val delegate: List<T?>, private val defaultIfNull: T) : AbstractList<T>() {
override val size = delegate.size
override fun get(index: Int): T {
return delegate[index] ?: defaultIfNull
}
}
Int
定义为可比
这至少有几个原因:
>
null是否应被视为大于或小于任何特定整数值是不明确的。
实际上,您不能使用可为null的变量作为可比变量来排序,因为您不能在
null
上调用
的约定是,它在两个方向上都是一样的,所以如果值为null,则不可能实现这一点。您可以定义自己的Compariable,该Compariable使用可空值,这可能有一些用途,但不能使用标准库排序函数对列表进行排序。compareTo()
。例如(null为Int?)?。compareTo(1)
将返回null,而不是-1/0/1,因此您实际上无法使用它对某些内容进行排序<代码>可比。compareTo()
如果不使用此类进行排序,则可能需要定义其他一些上界。
我需要能够在运行时告诉kotlin集合的泛型类型。我怎么做?
无法从自定义类获取泛型类型列表(Turns): 它说:
只能在类文本的左侧使用类 是否可以像在C#中那样对泛型参数提供类约束,或者是否可以使用其他语法来获取泛型参数的类型信息?
在类内部,我如何找到泛型类中传递的是什么类类型。例如,在上面,我想找到Integer被传递。
问题内容: 我有一个具有通用类型的Interface Foo- 有另一个实现该接口的Bar类,但我想要的是Bar的通用Type应该是Interface A和B类型的集合,使用以下定义,它给出了编译器错误- 您能提出实现此目标的正确方法吗? 我只能在方法级别使用多个范围吗? 问题答案: 这行不行吗?
我在Kotlin中有一个方法,它返回一个泛型列表的Rx可观察值: 因为Kotlin list特征定义为,Java将看到返回类型为。 是否有一种方法告诉Kotlin编译器,Java应该将其视为?