根据标题,我在一些代码中努力找到“未经检查或不安全的操作”警告的原因。
如果我有以下代码,则编译时没有任何警告:
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有什么不同?
任何帮助都会非常感激,因为虽然警告不是世界末日,但它却让我感到害怕! :(
此致
答案 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>
,这本质上是不安全的,因为前者可以保存后者无法拥有的值。
您还可以尝试参数化该方法,以便它可以与String
,Integer
或任何其他类型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;
时,这是一项未经检查的操作。