如何定义可扩展但不能为空的通用参数

时间:2018-10-23 02:09:13

标签: generics kotlin nullable

在Kotlin中,有没有一种方法可以定义不可为空的泛型参数,它是可为空类型的子类型? 我以为我可以做类似的事情

class nullableToNonnullable<A: Any?, B> where B: A, B: Any {
    fun toNonNull(a: A): B
}

但是我遇到了编译时错误:

如果类型参数受另一个类型参数的限制,则不能有其他限制

现在,我只能使用包装器类型来解决它,例如Option

class nullableToNonnullable<A: Any> {
    fun toNonNull(a: Option<A>): A
}

1 个答案:

答案 0 :(得分:1)

我不知道你到底想做什么,但是

(可为空的A)->(不是为空的A)函数

class nullableToNonnullable<A: Any> {
    fun toNonNull(a: A?): A
}

(可为空的A)->(不是A的空子类型)功能

class nullableToNonnullable<A: Any, B : A> {
    fun toNonNull(a: A?): B
}

在这里,尽管函数可以输入可为空的参数,但是应该将类中的类型参数A设置为非null。

我认为您不能将一个类类型参数限制为可为空(必须不为null),并且其中一个参数既应为前者的子类型,又不能在Kotlin中为null。

我认为您的示例中不需要案例类。

fun <A : Any> toNonNull(a: A?): A

fun <A : Any, B : A> toNonNull(a: A?): B