IntelliJ中具有泛型类型的未经检查的转换警告

我的 IDE (IntelliJ) 警告我未经检查的转换:

未经检查的覆盖:返回类型需要未经检查的转换。找到“com.company.Main.Cat”,需要“T”

尽管如此,我的代码按预期工作。我可以做些什么来防止出现此警告,或者我的代码是否存在“设计”缺陷?

以下 MCVE 重现了public Cat copy()for 中的警告Cat

   public static void main( String[] args )
   {
      Cat cat = new Cat( "Mimi" );
      Cat copyCat = cat.copy();
   }

   public static class Cat extends Animal
   {
      public String name;

      public Cat( final String name )
      {
         this.name = name;
      }

      @Override
      public Cat copy() // Unchecked conversion warning
      {
         return new Cat( this.name );
      }

   }

   public abstract static class Animal
   {
      abstract < T extends Animal > T copy();
   }

回答

您的Animal.copy方法是通用的,这表明调用者可以指定他们想要的动物类型……但您的实现不是通用的。

因此,例如,这是您的代码的稍微增强和更改的版本 - 请注意对main方法的更改,该方法仅用Animal作变量类型,但为该copy方法指定了类型参数:

public class Test {
    public static void main(String[] args) {
        Animal cat = new Cat("Mimi");
        Dog copyCat = cat.<Dog>copy();
    }

    public static class Cat extends Animal {
        public String name;

        public Cat(final String name) {
            this.name = name;
        }

        @Override
        public Cat copy() {
            return new Cat(this.name);
        }

    }

    public abstract static class Dog extends Animal {
    }

    public abstract static class Animal {
        abstract <T extends Animal> T copy();
    }
}

main方法在没有警告的情况下编译 - 很好。

但在执行时:

Exception in thread "main" java.lang.ClassCastException: Test$Cat cannot be cast to Test$Dog
        at Test.main(Test.java:6)

所以是的,您的代码存在设计缺陷,并且只能在您开始使用的用例中按预期工作。您几乎肯定不想使该方法通用。您可以使通用,也可以将抽象copy方法声明为返回Animal

Exception in thread "main" java.lang.ClassCastException: Test$Cat cannot be cast to Test$Dog
        at Test.main(Test.java:6)

现在这将允许Dog.copy()声明返回Cat当然......但这至少很简单。


以上是IntelliJ中具有泛型类型的未经检查的转换警告的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>