当前位置: 首页 > 知识库问答 >
问题:

如何在泛型Kotlin类中将上限与null值混合

禄俊逸
2023-03-14

我试图从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?不属于可比类型

共有2个答案

慕铭
2023-03-14

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
    }
}
郦昆
2023-03-14

Int定义为可比

这至少有几个原因:

>

  • null是否应被视为大于或小于任何特定整数值是不明确的。

    实际上,您不能使用可为null的变量作为可比变量来排序,因为您不能在null上调用compareTo()。例如(null为Int?)?。compareTo(1)将返回null,而不是-1/0/1,因此您实际上无法使用它对某些内容进行排序<代码>可比。compareTo()的约定是,它在两个方向上都是一样的,所以如果值为null,则不可能实现这一点。您可以定义自己的Compariable,该Compariable使用可空值,这可能有一些用途,但不能使用标准库排序函数对列表进行排序。

    如果不使用此类进行排序,则可能需要定义其他一些上界。

  •  类似资料: