[英]Method that works with any List and Generics/Type Erasure aspects
首先,创建一些代码(Java 7)只是为了说明我的问题。
import java.util.*;
class Generics101 {
public static void addTrue(List list) {
list.add(true);
}
public static void main(String[] args) {
List<Integer> testList = new ArrayList<>();
addTrue(testList);
System.out.println(testList.get(0));
// testList.add(true); // will not compile when uncommented
}
}
我有以下两个问题:
当我尝试更改方法参数以使用通配符列表时,它将无法编译。
它不会编译,因为您不能在List<?>
添加任何内容。 因为您不知道实际上是哪种类型的List
。 例如,仅考虑当前情况。 您正在传递List<Integer>
。 它将成功传递到List<?>
。 没有问题。 但是您要向其中添加一个boolean
类型true
。 如果编译器允许,它将在运行时引发ClassCastException
。 因此,这是不允许的。
因此,我假设在同一方法中将执行更严格的类型检查。 此类执法的确切范围是什么?
不,不是那样的。 不是在一定范围内进行类型检查。 无论使用泛型,它都会强制执行。 如果与正确的泛型一起使用,当前的代码将无法编译,因为您正在尝试将boolean
类型添加到List<Integer>
。 您为什么期望它能起作用?
尝试将您的方法更改为通用方法,您会发现它无法编译:
public static <T> void addTrue(List<T> list) {
list.add(true); // Won't compile
}
我浏览了泛型教程,但找不到答案。 我在这里想念的是什么?
好吧,这是Oracle的标准教程。 那是您应该阅读的地方。 除此之外,您还可以在Java Generics FAQs-Angelika Langer上浏览一个非常好的泛型教程集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.