[英]Unchecked cast involving wildcard types
有人可以解释为什么这是未经检查的演员吗
static void foo(Collection<? extends Number> collection) {
List<? extends Number> list = (List<? extends Number>) collection;
}
但这不是吗?
static void bar(List<? extends Number> list) {
Collection<? extends Number> collection = (Collection<? extends Number>) list;
}
我认为这与捕获有关,但是我想要一个清晰的解释。
编辑
我意识到这是一个措辞不佳的问题,正确的答案是“因为List
扩展了Collection
”。 但是,在IntelliJ中,它会生成警告,强制转换为更特定的类型时通常不会得到警告。 从下面的评论看来,这可能只是IntelliJ中的错误。 确切的警告在下面的注释中(由于某些原因,我在这里无法重现)。 我没有收到以下任何警告
static void foo(Collection<Number> collection) {
List<Number> list = (List<Number>) collection;
}
static <T> void foo(Collection<T> collection) {
List<T> list = (List<T>) collection;
}
static void foo(Collection<?> collection) {
List<?> list = (List<?>) collection;
}
因为从List<? extends Number>
List<? extends Number>
到List<? extends Number>
List<? extends Number>
是一个下垂的选项,通常需要在运行时检查对象的类型。 但是,运行时环境无法检查type参数是否确实是扩展Number
的类。 该信息在运行时不可用,Java泛型(“类型参数”)仅存在于静态Java类型系统中,它们不会影响已编译的代码。 因此,关于Collection
的唯一可以在运行时检查的是,如果Collection
是List
。
另一种情况是简单的转换,不需要任何运行时信息。 您可以在编译时检查该强制转换将始终有效。 因此,在运行时缺少有关类型参数的信息是无关紧要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.