我无法在Java中找到“未检查或不安全操作”警告的原因

时间:2010-05-12 02:48:18

标签: java generics unchecked

根据标题,我在一些代码中努力找到“未经检查或不安全的操作”警告的原因。

如果我有以下代码,则编译时没有任何警告:

public void test()
{
     Set<String> mySet = new HashSet<String>();
     Set<String> myNewSet = mySet;
     //do stuff
}

现在,如果我改变 mySet 的来源,特别是作为方法调用的结果,我得到“未经检查的yadda yadda”警告:

public void test()
{
    Set<String> myNewSet = this.getSet();
    //do stuff
}

public Set getSet()
{
    Set<String> set = new HashSet<String>();
    return set;
}

我已经尝试过并试图解决问题所在并且我完全被困住了。无论我使用集合还是列表,都会出现此问题。为什么getSet方法返回的Set与第一个示例中的Set有什么不同?

任何帮助都会非常感激,因为虽然警告不是世界末日,但它却让我感到害怕! :(

此致

5 个答案:

答案 0 :(得分:4)

您需要声明方法以返回参数化类型。

public Set<String> getSet()
{
    Set<String> set = new HashSet<String>();
    return set;
}

要了解有关泛型的更多信息,请查看Sun tutorial on the subject (PDF)

答案 1 :(得分:2)

解决方案是从

更改方法签名
public Set getSet()

public Set<String> getSet()

您正在尝试将原始Set分配给Set<String>,这本质上是不安全的,因为前者可以保存后者无法拥有的值。

您还可以尝试参数化该方法,以便它可以与StringInteger或任何其他类型T一起使用。

答案 2 :(得分:1)

public Set<String> getSet()  // You need to change the signature to this.
{
    Set<String> set = new HashSet<String>();
    return set;
}

答案 3 :(得分:0)

您忘记正确声明getSet()调用的返回类型。

你有:

public Set getSet() {

而你想要像这样返回Set<String>

public Set<String> getSet() {

答案 4 :(得分:0)

您的方法返回Set,而不是Set<String>,因此当您指定Set<String> mySet = Set;时,这是一项未经检查的操作。