【发布时间】:2015-09-15 18:38:17
【问题描述】:
有人可以解释为什么这是一个未经检查的演员表
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 中,它会生成一个警告,在转换为更具体的类型时通常不会得到该警告。从下面的 cmets 看来,这可能只是 IntelliJ 中的一个错误。确切的警告在下面的 cmets 中(由于某种原因,我无法在此处复制它)。我没有收到以下任何警告
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;
}
【问题讨论】:
-
是什么让你认为它没有被检查?如果你用
-Xlint:unchecked编译它,你不会收到任何关于未经检查的强制转换的警告。 -
啊,那可能就是 IntelliJ 了。确切的消息是
Unchecked cast: 'java.util.Collection<capture<? extends java.lang.Number>>' to 'java.util.List<? extends java.lang.Number>' -
对于从
Object到String的演员表,它不会给你同样的效果? -
没有。当我删除通配符时,它也不会给我同样的结果。
标签: java generics intellij-idea