gpt4 book ai didi

java - 为什么泛型中未指定的类型会破坏非泛型方法的类型安全

转载 作者:行者123 更新时间:2023-11-30 08:36:30 25 4
gpt4 key购买 nike

<分区>

有人可以解释一下,为什么一个简单的 <T>在我的界面中会在编译时破坏类型安全吗?请参阅以下示例:

public class GenericsMain {

public static void main(String[] args){
A someA = new A() {
@Override
public List<String> listOfStrings() {
return Arrays.asList("A");
}
};
B someB = new B() {
@Override
public List<String> listOfStrings() {
return Arrays.asList("B");
}
};
List<Long> listOfLong = null;
//listOfLong = someA.listOfStrings(); // compile error (expected)

listOfLong = someB.listOfStrings(); // NO COMPILE ERROR. Why !?

for(Long l : listOfLong){ // here I get ClastCastException of course.
System.out.println(l);
}
}

interface A{
List<String> listOfStrings();
}

interface B<T>{
List<String> listOfStrings();
}
}

同样有趣的是,如果 <T> 的类型被指定,编译器再次正确地提示。所以看起来泛型也会影响非泛型方法声明!?

B<Integer> someBOfInteger = null;
listOfLong = someBOfInteger.listOfStrings(); // compiler complains correctly

正确答案后更新:

因此,如果需要使用泛型扩展类型,最好真正创建一个子类/子接口(interface)并在子类中添加泛型类型。所以在上面的例子中,可以通过

向 A 添加一个泛型方法
interface C<T> extends A {
T genericMethod(T p);
}

同样如所引用的问题所示,使用编译器标志是个好主意:

javac -Xlint:unchecked ....

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