generics - Kotlin 列表包含来自 T 以外类型的对象
问题描述
我正在做一个 Kotlin 练习,其中我需要将来自文件的输入列表转换为 Longs。我做了一个我认为很好的函数,将输入从字符串列表转换为我需要的任何类型的列表,如果它无法转换输入,基本上就忽略它。
我最终得到的是一个带有字符串对象的列表,我不知道这是怎么发生的。谁能向我解释这怎么可能以及如何使实际的理想化功能起作用?
这是功能:
fun <T: Any> readInputIntoList(fileName: String): List<T> {
return File(ClassLoader.getSystemResource(fileName).toURI())
.readLines()
.mapNotNull { it as T}
}
这是我使用的一个简单的测试代码:
val input = Utils.readInputIntoList<Long>("input.txt")
print(input[0] is Long)
这打印“假”。
文件的内容可能是这样的:
123457
98952
65241
62222
144922
解决方案
当您像it as T
在 Kotin 或(T)it
Java 中那样进行类型转换时,您有责任确保对象是您所说的类型,或者ClassCastException
将导致结果。
通常,它会立即发生,但在这种情况下,您将转换为泛型类型参数。Java/Kotlin 使用类型擦除实现泛型。这意味着您的方法 只有一个实现。readInputIntoList<String>
并且readInputIntoList<Long>
当您向它们传递相同的(实际)参数时会做完全相同的事情,因为它是相同的代码。
该类型T
不是该方法的参数,因此该方法无法实际检查以确保它it
是正确的类型。它只是假设您知道自己在做什么,而演员表根本没有影响。如果结果是错误的类型,那么ClassCastException
当有人尝试使用列表内容时,通常会出现 a。
推荐阅读
- python-3.x - Pygame屏幕在翻转时被清除,但只有一次
- c# - MVC ASP.NET CORE 注册密钥验证
- url - 如何从 osmosis 视频中下载 blob url
- javascript - 在div内容加载动态jquery之前添加图片
- node.js - NodeJS Crypto 无法验证 Web Crypto API 创建的签名
- html - 在 symfony 和 html 中的 select 中选择默认选择字段
- c - 如何访问C中数组内的指针索引?
- css - 用一些背景颜色突出显示每隔 li 行
- c - C:共享内存和fork,print语句执行多次
- byte-buddy - 声明的作用是什么?Bytebuddy 中的 ElementMatcher