作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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/
我是一名优秀的程序员,十分优秀!