kotlin - Kotlin 中的“任何”上限与默认值(无边界)有何不同?
问题描述
此代码无法编译,KClass 类型出现错误:
interface Foo<T> {
val tClass: KClass<T>
}
类型参数不在其范围内。预期:任何,发现:T
这就是说 KClass 需要一个 Any 类型参数,但 T 不是 Any。
那么这些有什么区别呢?
<T>
<T: Any>
<T: Any?>
解决方案
为了解释这一点,最好从 Java 与 Kotlin 的类型系统之间的差异开始。
在 Java 中,所有类都从 Object 继承,并且 Object 既可以为空,也可以不为空。在 Kotlin 中,可空类型和不可空类型之间存在区别。默认情况下,基本类型是Any?
因此<T>
默认为 type Any?
。由于您传入的是不可为空的类型,因此您需要声明它<T: Any>
而不是Any?
.
因此,与表示只能将一个不可为空的类型传递给此方法的类型<T>
相同。<T: Any?>
<T: Any>
推荐阅读
- hangouts-chat - 如何通过环聊 API 删除一个环聊/聊天室中的所有消息?
- macos - 错误:0:10:未声明的标识符“texture2D”的无效调用
- javascript - 为什么我的状态不能使用 Redux 正确改变?
- ios - Ionic 应用程序无法在 iphone 7 plus 中打开显示白屏,但它在 iphone 6 中工作?
- c - 数组是静态数据结构。那么如何动态分配内存呢?
- c - 从kafka获取最后写入的消息偏移量
- html - HTML5 电子邮件输入中的国际字符,例如 Ä、ä、Ö、ö、Ü、ü、ß
- angular - 角 | 将服务注入装饰器
- batch-file - Bat 文件创建目录,其目录名称取自 .txt 文件
- docker-compose - Docker Swarm 中的 NFS 卷:权限被拒绝