Collections 使用对象实现空列表时出错

Collections 使用对象实现空列表时出错,collections,kotlin,Collections,Kotlin,我试图重写列表接口,作为学习Kotlin函数编程的练习,但我无法理解为什么我在尝试将对象作为空列表时出错,这在Kotlin标准库中不会发生。在下面的代码中,我想使用NIL作为单例空列表,使用list()作为返回它的函数。但是,这会在类型为“Required List.Found NIL”的函数上生成类型不匹配错误 但是,如果我将NIL更改为NIL:List,则解决方案NIL-as-List不会出现任何问题。您界面上的泛型应该是,而不是 此外,IntelliJ Idea在这种情况下使用泛型时会显示

我试图重写列表接口,作为学习Kotlin函数编程的练习,但我无法理解为什么我在尝试将对象作为空列表时出错,这在Kotlin标准库中不会发生。在下面的代码中,我想使用NIL作为单例空列表,使用list()作为返回它的函数。但是,这会在类型为“Required List.Found NIL”的函数上生成类型不匹配错误


但是,如果我将
NIL
更改为
NIL:List
,则解决方案
NIL-as-List
不会出现任何问题。

您界面上的泛型应该是
,而不是

此外,IntelliJ Idea在这种情况下使用泛型时会显示一条警告。

您可以将
列表转换为函数中的
列表,例如:

fun <A> list(): List<A> = NIL as List<A>;
@Suppress("UNCHECKED_CAST")
fun <A> list(): List<A> = NIL as List<A>;
fun <A> list(): List<A> = object : List<A> {
    override val empty: Boolean = true
    override val head: A
        get() = throw IllegalStateException("head called on empty list")

    override val tail: List<A>
        get() = throw IllegalStateException("tail called on empty list")
};
fun list():list=object:list{
覆盖值为空:布尔值=真
覆盖val头:A
get()=抛出IllegalStateException(“在空列表上调用头”)
覆盖val尾部:列表
get()=抛出IllegalStateException(“在空列表上调用尾部”)
};

但是我应该使用
@UnsafeVariance
符号来实现
包含(元素:A)
之类的方法吗?是的,您可以在这里阅读更多关于这种情况的信息-但是,@UnsafeVariance的使用不允许执行我在问题更新中发布的测试中的操作。我已经用一个示例更新了问题。在您的建议中,只有匿名对象允许毫无例外地通过测试。@gmariotti,因为您对
NIL
使用
Nothing
。用一切正常的
Any?
替换
Nothing
。也许这能帮你。第三种方法将为您可以测试的每个调用创建一个新的对象实例:
assertNotSame(list(),list())@Suppress("UNCHECKED_CAST")
fun <A> list(): List<A> = NIL as List<A>;
fun <A> list(): List<A> = object : List<A> {
    override val empty: Boolean = true
    override val head: A
        get() = throw IllegalStateException("head called on empty list")

    override val tail: List<A>
        get() = throw IllegalStateException("tail called on empty list")
};