繁体   English   中英

未经检查的涉及通配符类型的演员表

[英]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的唯一可以在运行时检查的是,如果CollectionList

另一种情况是简单的转换,不需要任何运行时信息。 您可以在编译时检查该强制转换将始终有效。 因此,在运行时缺少有关类型参数的信息是无关紧要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM