小编Tob*_*ens的帖子

Java和Kotlin使用泛型进行投射.丢失类型安全

在使用Kotlin/Java进行编码时,我在使用强制转换和泛型时偶然发现了一些奇怪的东西.似乎有可能让类型系统认为列表是类型List<Foo>,而它实际上是一个List<Object>.

任何人都可以向我解释为什么这是可能的?

以下是Kotlin和Java中的一个例子:

Kotlin中的例子

fun <T> test(obj: Any): List<T> {
    val ts = ArrayList<T>()
    ts.add(obj as T)
    return ts
}

fun <T> test2(obj: Any): T {
    return obj as T
}

fun <T> test3(obj: Any): List<T> {
    val ts = ArrayList<T>()
    ts.add(test2(obj))
    return ts
}


fun main(args: Array<String>) {
    val x = test<Double>(1) // Returns a list of Integers and doesn't error
    println(x)

    val y = test2<Double>(1) // Casts the Int object to a Double.
    println(y) …
Run Code Online (Sandbox Code Playgroud)

java generics casting kotlin erasure

9
推荐指数
2
解决办法
612
查看次数

标签 统计

casting ×1

erasure ×1

generics ×1

java ×1

kotlin ×1