【发布时间】:2021-12-19 18:54:56
【问题描述】:
考虑以下 sn-p:
class MyClass<E>{
...
public void checkType(Object o){
if(o instanceof List<E>){ //this gives compilation error
List<E> list = (List<E>)o; //this gives unchecked warning
}
}
...
}
- 这里,
instanceof将给出编译错误,因为E的类型在运行时是未知的。 - 为什么
(List<E>)o会发出警告?我认为这应该由编译器以同样的理由报告为错误。
我不确定是否有任何情况为什么这不会是错误而只能作为警告。
【问题讨论】:
-
强制转换操作永远不会导致编译错误。强制转换只会改变编译器的“视图”。基本上,如果我们作为开发人员选角,我们就要对选角负责。
-
@Turing85 :但是为什么编译器允许不符合其含义的语法? - 很明显,在任何情况下,AFAIK 这永远不会是真的。如果它被转换为具体类型 - 这仍然可能是一种可能性 - 但是使用 Variable 类型参数 - 我猜没有机会。
-
@Turing85 这不是真的。从
String转换为Integer是一个编译错误。我认为更好的答案是,如果未经检查的强制转换也变成错误,那么很多事情就变得不可能了。 -
@Sweeper 是真的。我们只能沿着层次结构“向下转型”,而不能“侧向转型”。
-
@theutonium.18 "但是为什么编译器允许不符合其含义的语法?" - 含义由 JLS 定义。跨度>
标签: java generics jls unchecked-cast