gpt4 book ai didi

java - 为什么可以转换泛型类?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:41:19 25 4
gpt4 key购买 nike

Java 泛型是不变的,所以不可能进行这样的转换:

List<Object> li = (List<Object>)new ArrayList<Integer>();

但在下面第 4 行的代码中,我可以从 List<Integer> 进行转换至 List<T> , 其中T可以是任何类型。为什么允许这种类型的转换?

我知道它会生成关于未经检查的转换的警告,但要点是这种转换在参数化方法中是可能的,但在普通代码中是不可能的。请记住,泛型是不变的,为什么它被允许?在有 List<Integer> 的正常代码中我只能将它转换为 List<Integer>这没有意义,其他类型转换是非法的。那么允许第 4 行中的强制转换有什么意义呢?

我知道泛型类型在编译时被删除,它以 List xlist = (List)list 结尾, 但在删除这些类型之前,很明显不应允许此强制转换,除非仅在有人将 Integer 作为 el 传递时才被接受。这没有多大意义。

class Test {

public static <T> void t(List<Integer> list, T el) {
List<T> xlist = (List<T>)list; //OK
xlist.add(el);
}

public static void main(String[] args) {

List<Integer> list = new ArrayList<>();
t(list, "a");
t(list, "b");

//prints [a, b] even if List type is Integer
System.out.println(list);

}
}

最佳答案

在 Java 中,执行在编译时已知始终不正确或始终正确的显式转换是编译错误。来自 List<Integer> 的 Actor 阵容至 List<Object>在编译时已知总是不正确的,因此它是不允许的。来自 List<Integer> 的 Actor 阵容至 List<T>在编译时不知道它总是不正确的——如果 T 就是正确的是Integer , 和 T在编译时未知。

关于java - 为什么可以转换泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com