【问题标题】:Solving peculiar 'unchecked cast' warning解决特殊的“未经检查的演员表”警告
【发布时间】:2018-03-02 15:38:23
【问题描述】:

我有一个对象,其中泛型T 的类型在某个时候通过一个巨大的接口链丢失了。我想知道是否可以使用函数通过检查类型来重新获得某种类型的安全性:

private T metaData; // type of T is lost
public <R> R getMetaData(Class<R> className) {
    assert className.isInstance(metaData);
    return (R) metaData;
}

但是,此实现会产生“未经检查的强制转换:'T' to 'R'”警告。是否有避免此警告的实现,或者是抑制它的唯一解决方案?

【问题讨论】:

  • 基本上,Class.cast 是一个已经有@SuppressWarning 注解的方法。转换仍未检查。
  • 这实际上有什么改善吗?你会得到一个断言错误而不是一个类转换异常,有什么大的区别?

标签: java generics


【解决方案1】:

您不必使用() 强制转换为R,您可以直接使用Class。喜欢,

return className.cast(metaData);

这里不会引起任何警告。

【讨论】:

  • 您可以补充一点,当对象不为 null 且不可分配给 R 时,这会引发潜在的 ClassCastException(尽管在这种情况下不可能)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多