首页 > 解决方案 > 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

标签: genericskotlincastingtype-conversion

解决方案


当您像it as T在 Kotin 或(T)itJava 中那样进行类型转换时,您有责任确保对象是您所说的类型,或者ClassCastException将导致结果。

通常,它会立即发生,但在这种情况下,您将转换为泛型类型参数。Java/Kotlin 使用类型擦除实现泛型。这意味着您的方法 只有一个实现。readInputIntoList<String>并且readInputIntoList<Long>当您向它们传递相同的(实际)参数时会做完全相同的事情,因为它是相同的代码

该类型T不是该方法的参数,因此该方法无法实际检查以确保它it是正确的类型。它只是假设您知道自己在做什么,而演员表根本没有影响。如果结果是错误的类型,那么ClassCastException当有人尝试使用列表内容时,通常会出现 a。


推荐阅读