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

标签 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
}

最佳答案

我不知道你到底想做什么

(可空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

关于generics - 如何定义可扩展但不能为空的通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52940150/

相关文章:

java - 纠正上限类类型 Iterable 和上限通配符 List 字段 Iterator 类型

c# - 使用 GetType() 创建 List<T>

java - Java 中的泛型 - 实例化 T

Java 泛型 : Inferring types over two parameters

android - 膨胀类 com.google.android.material.textfield.TextInputLayout 时出错

android - 如何在 Kotlin 中删除小数末尾多余的零?

android - Kotlin Coroutine Retrofit - 链式网络调用

c# - 我怎么能在int上执行方法?在没有 NullReferenceException 的情况下设置为 null?

types - 有没有一种很好的方法可以在 Go 中模拟 "Maybe"或 "option"类型?

php - 在elasticsearch索引中存储带有可选参数的日期时间?