gpt4 book ai didi

Java 泛型 - 为什么此方法调用被视为未经检查的转换

转载 作者:行者123 更新时间:2023-12-04 20:50:33 25 4
gpt4 key购买 nike

以下代码示例可以编译,但会出现编译器警告

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class SubArrayList<T> extends ArrayList{}

class ZiggyTest2{

public static void main(String[] args){
ArrayList<Animal> nums = new SubArrayList<Animal>();

}

public static void testMethod(ArrayList<Animal> anim){
System.out.println("In TestMethod");
}
}

当我编译上面的代码时,我收到以下警告

Note: ZiggyTest2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

或者如果我用 -Xlint:unchecked 编译它,我会收到以下警告

ZiggyTest2.java:12: warning: [unchecked] unchecked conversion
found : SubArrayList<Animal>
required: java.util.ArrayList<Animal>
ArrayList<Animal> nums = new SubArrayList<Animal>();
^
1 warning

如果我将 nums 的初始化更改为

List<Animal> nums = new ArrayList<Animal>(); 

然后我没有收到任何警告。

为什么他们的行为不同。 ArrayList 是 List 的子类型,而 SubArrayList 是 ArrayList 的子类型,所以我期望实例化是相同的。

谢谢。

编辑

此外,如果我调用该方法并向其传递一个一般初始化的引用,它也会产生警告。

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class SubArrayList<T> extends ArrayList{}

class ZiggyTest2{

public static void main(String[] args){
SubArrayList<Animal> nums = new SubArrayList<Animal>();
testMethod(nums);

}

public static void testMethod(ArrayList<Animal> anim){
System.out.println("In TestMethod");
}
}

我认为只有将通用代码与非通用代码混合使用时才会出现编译器警告。

最佳答案

你的 SubArrayList<T>类仅扩展 ArrayList (本质上是 ArrayList<?> ),而不是 ArrayList<T> , 从 SubArrayList<T> 进行类型转换制作至 ArrayList<T>未选中。

如果将其更改为 class SubArrayList<T> extends ArrayList<T> {} , 你不会再有问题了:)

关于Java 泛型 - 为什么此方法调用被视为未经检查的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8416557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com