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当然......但这至少很简单。