java - 有没有办法在这段代码中避免@SuppressWarnings?

标签 java arrays generics collections casting

有没有一种方法可以避免使用下面的 @SuppressWarnings 并在没有警告的情况下保持相同的功能 'Type safety: Unchecked cast from AbstractDO[] to E[]':

public MyClass {
  ...
  private Map<Class<? extends AbstractDO>, AbstractDO[]> map;
  ...
  private void saveConcreteDOs(AbstractDO[] theEntities) {        
    entityMap.put(theEntities[0].getClass(), theEntities);
  }

  @SuppressWarnings("unchecked")
  protected <E extends AbstractDO> E[] getConcreteDOs(Class<E> theType) {
    return (E[]) map.get(theType);
  }
  ...
}

也许增强 map 声明?

最佳答案

您有一个选择:要么抑制对您知道总是会成功的转换的警告,要么避免警告并使用 try/catch block 验证转换是否成功。

只有这两个选择。

maybe there is a way to enhance map declaration?

对于您的情况,我认为您有几种选择。

我认为最好的办法是向您的 getConcreteDOs 方法添加一个 throws ClassCastException 子句,让调用者处理由无效使用方法——假设他们可以让它围绕您的 extends AbstractDO 子句进行编译。这有一个不幸的副作用,即强制消费者将调用包装在 try/catch block 中或声明他们自己的 throws 子句以强制 try/catch block 在堆栈的更高位置。

您可以用一个空的 catch block 吞下异常;坦率地说,我更喜欢@SuppressWarning。

或者您可以完全放弃该方法,只处理抽象实体,有效地让存储库的使用者处理转换。

底线:每当您尝试构建通用存储库时,您都会遇到这些问题。使用每个实体类型具体存储库的模式可能会更好。

关于java - 有没有办法在这段代码中避免@SuppressWarnings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730037/

相关文章:

java - 将代码部署到 Amazon EC2 实例

java - 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

c# - 如何使用反射调用泛型类型内的非泛型方法

java - 是mockito改变了对象吗?

java - 基于整数的舍入问题

javascript - 动态创建一个数组,然后循环另一个数组来比较数据是否存在

java - 如何在java中的for循环中创建数组

java - 在 Java 中,通配符能做什么常规泛型不能做什么?

java - JList 不显示为列表,只是一个点...也许是一个图形点?

java - 在 JTable 中显示 JCheckBox