3

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

如果我有以下代码,它将在没有任何警告的情况下编译:

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

现在,如果我更改mySet的来源,特别是作为方法调用的结果,我会收到“unchecked 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 有什么不同?

任何帮助都将不胜感激,因为虽然警告不是世界末日,但它让我很烦!:(

问候

4

5 回答 5

4

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

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

要了解有关泛型的更多信息,请查看有关该主题的 Sun 教程 (PDF)

于 2010-05-12T02:50:36.307 回答
2

解决方案是将您的方法签名从

public Set getSet()

public Set<String> getSet()

您正在尝试将 raw 分配Set给 a Set<String>,这本质上是不安全的,因为前者可以保存后者不能保存的值。

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

于 2010-05-12T02:52:36.770 回答
1
public Set<String> getSet()  // You need to change the signature to this.
{
    Set<String> set = new HashSet<String>();
    return set;
}
于 2010-05-12T02:54:53.733 回答
0

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

你有:

public Set getSet() {

而你想返回Set<String>这样的:

public Set<String> getSet() {
于 2010-05-12T02:50:53.943 回答
0

您的方法返回Set, not Set<String>,所以当您分配时Set<String> mySet = Set; 这是一个未经检查的操作。

于 2010-05-12T02:51:25.897 回答