【问题标题】:I can't find the cause of an "unchecked or unsafe operations" warning in Java我在 Java 中找不到“未经检查或不安全的操作”警告的原因
【发布时间】:2010-05-12 02:48:18
【问题描述】:

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

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

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 有什么不同?

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

问候

【问题讨论】:

标签: java generics unchecked


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    public Set getSet()
    

    public Set<String> getSet()
    

    您正在尝试将原始 Set 分配给 Set&lt;String&gt;,这本质上是不安全的,因为前者可以保存后者不能保存的值。

    您也可以尝试对方法进行参数化,使其适用于StringInteger 或任何其他类型的T

    【讨论】:

      【解决方案3】:
      public Set<String> getSet()  // You need to change the signature to this.
      {
          Set<String> set = new HashSet<String>();
          return set;
      }
      

      【讨论】:

        【解决方案4】:

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

        你有:

        public Set getSet() {
        

        而您想像这样返回Set&lt;String&gt;

        public Set<String> getSet() {
        

        【讨论】:

          【解决方案5】:

          您的方法返回Set,而不是Set&lt;String&gt;,因此当您分配Set&lt;String&gt; mySet = Set; 时,这是一个未经检查的操作。

          【讨论】:

            猜你喜欢
            • 2019-02-09
            • 2013-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多