【问题标题】:How to fix unchecked call warning in Java?如何修复 Java 中未经检查的调用警告?
【发布时间】:2025-12-08 09:00:01
【问题描述】:

这是我写的代码?

Set keys = map.keySet();
SortedSet s = new TreeSet(keys);

我得到的警告是:

warning: [unchecked] unchecked call to TreeSet(java.util.Collection<? extends E>) as a
         member of the raw type java.util.TreeSet

如何摆脱编译器警告?

【问题讨论】:

  • 我们需要查看更多代码(以查看上下文)。我怀疑这是因为您没有使用泛型而不是强制转换,但是再次......如果您不发布导致警告的代码,我们无能为力,只能猜测。

标签: java


【解决方案1】:

理想情况下,开始完全使用泛型。您还没有显示 map 的类型是什么,但理想情况下您应该能够编写如下内容:

Set<String> keys = map.keySet();
SortedSet<String> s = new TreeSet<String>(keys);

map 类似于Map&lt;String, Integer&gt; 的情况下。

如果map 本身是一个原始类型,那就更难了——同样,最好的解决办法是开始在你的代码库中添加泛型,摆脱原始类型。当然,如果地图是从第三方代码返回的,这并不总是可行的。在这种情况下,当您从原始类型转换为泛型类型时,您可能需要禁止 one 行上的警告 - 可能通过 Collections.checkedCollection - 但之后,您应该能够使用泛型类型“适当地”。例如:

@SuppressWarnings("unchecked") // Just for this one statement
Collection<String> keys = Collections.checkedCollection(map.keySet(),
                                                        String.class);

// Now this statement is fully generic with no warnings
SortedSet<String> s = new TreeSet<String>(keys);

【讨论】:

    【解决方案2】:

    就这个问题而言,您应该使用参数化类型的键,例如

    Set<TypeOfKeyObject> keys = map.keySet();
    SortedSet<TypeOfKeyObject> s = new TreeSet<TypeOfKeyObject>(keys);
    

    TypeOfKeyObjectmap 对象中 Key 的对象类型。

    您可以强制取消警告(如已正确建议的那样),但不建议这样做。

    冒着听起来居高临下的风险,我建议你学习泛型。一个好的起点是:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

    【讨论】:

    • “使用参数化类型的键”是正确答案并且足够了。告诉 OP“你需要学习泛型”是居高临下的。如果我们学习过,我们就不需要 SO,现在是吗?尽管如此,我还是投了赞成票。 :-P
    • 你既没有给他一条鱼,也没有教他钓鱼;你是在告诉他从图书馆借一本关于钓鱼的书。
    • 第二段我给了他鱼。这本关于钓鱼的书是一种告诉他如何在我们的交流媒介下钓鱼的方式。 :) 放轻松。
    • 投了赞成票,只是因为有人抱怨你建议学习仿制药。
    最近更新 更多