【发布时间】:2021-06-02 17:08:47
【问题描述】:
根据我自己的实验,我得出的结论是,对象或对象引用的任何类型参数在作为参数传递给方法时都会被剥离。如果方法的参数使用类型参数进行参数化,就会弹出类型参数的问题:
<T> void method (ArrayList<T> list) {
list.add( (T) new Integer(4));
sysout (list.get(0));
}
那么,如果我们将两个参数化的 ArrayList 中的每一个都传递给该方法的调用:
method(new ArrayList<Integer>());
method(new ArrayList<String>());
我们将看到两者都没有产生错误并且都打印 4。我假设编译器将 T 的擦除保留为 Object。这个实验不是证明类型参数没有传递给方法吗?
【问题讨论】:
-
T是无限的,所以你真正拥有的是ArrayList<Object>。这就是你的代码编译的原因。 -
Java 编译器只是在编译时检查泛型。然后他们被删除。尽管在 JVM 中运行的字节码不知道您使用的是什么泛型类型。我猜这可能是因为兼容性,因为在Java 5之前只有
List(没有泛型,因为当时没有泛型),而当Java 5发布时它改为List<T>,但是你今天仍然可以使用List(没有泛型)事件并且只收到一些编译器警告。
标签: java generics parameter-passing pass-by-value