【问题标题】:Why Variable-Parameterized variant of (cast) operator in Java is flagged as unchecked warning and not error?为什么Java中(cast)运算符的变量参数化变体被标记为未经检查的警告而不是错误?
【发布时间】: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&lt;E&gt;)o 会发出警告?我认为这应该由编译器以同样的理由报告为错误。

我不确定是否有任何情况为什么这不会是错误而只能作为警告。

【问题讨论】:

  • 强制转换操作永远不会导致编译错误。强制转换只会改变编译器的“视图”。基本上,如果我们作为开发人员选角,我们就要对选角负责。
  • @Turing85 :但是为什么编译器允许不符合其含义的语法? - 很明显,在任何情况下,AFAIK 这永远不会是真的。如果它被转换为具体类型 - 这仍然可能是一种可能性 - 但是使用 Variable 类型参数 - 我猜没有机会。
  • @Turing85 这不是真的。从String 转换为Integer 是一个编译错误。我认为更好的答案是,如果未经检查的强制转换也变成错误,那么很多事情就变得不可能了。
  • @Sweeper 是真的。我们只能沿着层次结构“向下转型”,而不能“侧向转型”。
  • @theutonium.18 "但是为什么编译器允许不符合其含义的语法?" - 含义由 JLS 定义。跨度>

标签: java generics jls unchecked-cast


【解决方案1】:

刚刚看到这段代码表明为什么 Non-Reified Casts with Type Parameters 只能是警告而不是错误:

public static <T> List<T> getAsList(Collection<T> c){
        if(c instanceof List<?>){
            return (List<T>)c;
        }
        ...
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2013-01-20
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多