Eclipse向我发出了以下形式的警告:

类型安全:未选中从对象到HashMap的强制转换

这是对API的调用,我无法控制该API返回的对象:

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
  HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
  return theHash;
}

如果可能的话,我希望避免出现Eclipse警告,因为理论上它们至少表明了潜在的代码问题.不过,我还没有找到消除这个问题的好方法.我可以单独将涉及的单行提取到一个方法中,并在该方法中添加@SuppressWarnings("unchecked"),从而限制忽略警告的代码块的影响.还有更好的 Select 吗?我不想在Eclipse中关闭这些警告.

在我开始编写代码之前,它比较简单,但仍然引发了警告:

HashMap getItems(javax.servlet.http.HttpSession session) {
  HashMap theHash = (HashMap)session.getAttribute("attributeKey");
  return theHash;
}

问题出在其他地方,当您try 使用散列时,会收到警告:

HashMap items = getItems(session);
items.put("this", "that");

Type safety: The method put(Object, Object) belongs to the raw type HashMap.  References to generic type HashMap<K,V> should be parameterized.

推荐答案

哇!我想我找到了自己问题的答案.我只是不确定这是否值得!:)

问题是演员阵容没有被判断.所以,你必须亲自判断.不能只使用instanceof判断参数化类型,因为参数化类型信息在运行时不可用,在编译时已被删除.

但是,您可以使用instanceof对散列中的每一项执行判断,并且通过这样做,您可以构造类型安全的新散列.你也不会引起任何警告.

多亏了mmyers和Esko Luontola,我已经参数化了我最初在这里编写的代码,所以它可以包装在某个实用程序类中,并用于任何参数化的HashMap.如果您想更好地理解它,并且不太熟悉泛型,我建议您查看此答案的编辑历史.

public static <K, V> HashMap<K, V> castHash(HashMap input,
                                            Class<K> keyClass,
                                            Class<V> valueClass) {
  HashMap<K, V> output = new HashMap<K, V>();
  if (input == null)
      return output;
  for (Object key: input.keySet().toArray()) {
    if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {
        Object value = input.get(key);
        if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {
            K k = keyClass.cast(key);
            V v = valueClass.cast(value);
            output.put(k, v);
        } else {
            throw new AssertionError(
                "Cannot cast to HashMap<"+ keyClass.getSimpleName()
                +", "+ valueClass.getSimpleName() +">"
                +", value "+ value +" is not a "+ valueClass.getSimpleName()
            );
        }
    } else {
        throw new AssertionError(
            "Cannot cast to HashMap<"+ keyClass.getSimpleName()
            +", "+ valueClass.getSimpleName() +">"
            +", key "+ key +" is not a " + keyClass.getSimpleName()
        );
    }
  }
  return output;
}

工作量很大,可能报酬很低……我不确定我是否会用它.我非常感谢任何关于人们认为这是否值得的 comments .另外,我也很欣赏改进建议:除了抛出AssertionError之外,我还能做什么更好的事情吗?有没有更好的我可以扔的东西?我应该把它设为选中的例外吗?

Java相关问答推荐

Java应用程序RAC感知

Java -使用空比较或instanceof?

我可以在regex中的字符类中放置断言吗?

将具有多个未知字段的SON映射到Java POJO

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

为什么Java中的两个日期有差异?

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

H2弹簧靴试验跌落台

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

在Spring Boot中使用哪个Java类来存储创建时间戳?

自定义批注的外推属性值

无法在Java中处理PayPal支付响应

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

声明带有泛型的函数以用作查找映射中的值

使用存储在字符串变量中的路径目录打开.pdf文件

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

带有可选部分的Java DateTimeForMatter

对角线填充二维数组

在ECLIPSE上的M1 Pro上运行JavaFX的问题