在阅读JVM的时候..。我穿过了这些线
JVM对类型参数一无所知。Java编译器删除所有类型参数,并将其替换为类型对象。然后,参数类型T的数组成为JVM上下文中的对象数组,这就是为什么不能编写像新Tn这样的表达式。
这是不是意味着当我写
职能(Int a)
A被类型对象替换,即用Integer对象替换?或者int[10];变成了Integer[10];,如果不是这样的话,它意味着什么?
请用简单的术语来解释。
发布于 2015-03-13 15:39:46
类型擦除仅指仿制药。像Function(int a)这样的方法不会受到影响。
另一方面,该代码将:
public class Node<T> {
private T data;
private Node<T> next;
public Node(T data, Node<T> next) }
this.data = data;
this.next = next;
}
public T getData() { return data; }
// ...
}将由以下内容取代:
public class Node {
private Object data;
private Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
public Object getData() { return data; }
// ...
}(取自这里的例子)
发布于 2015-03-13 15:39:30
Java编译器删除所有类型参数,并将其替换为类型对象。
本文专门讨论泛型类中的类型参数。所以如果您编写的方法如下所示
public <T> void foo(T arg);生成的方法中的arg类型将是java.lang.Object。非一般方法保持不变。
这是否意味着当我编写
function(int a)a时被替换为类型对象,即Integer对象?
没有,因为规则只适用于使用泛型类型参数作为参数或返回类型的泛型类的泛型方法和方法。
因此,如果我的
List<>应该存储String,如果有关String的信息被删除并转换为Object,那么JVM如何知道它应该接受String来存储在List<>中,以及如何检查呢?
JVM不知道也不检查列表中的对象类型,因为它没有相关的信息。泛型类型参数的所有类型检查都是在编译时完成的。JVM知道在运行时进入列表的对象实际上是String的,因为编译器确保所有类型安全的代码路径都将字符串放入列表中。另一方面,您可以通过类型转换列表或使用它的非一般方法来欺骗编译器,让您将无效对象放置到列表中(例如,Integers到列表的Strings中),但是对编译器的愚弄则是对您的蓄意操作。
有关类型擦除的更多信息,请参见本教程。
发布于 2015-03-13 15:39:25
您弄错了:类型擦除与Java泛型相关。
如果编写类似于List<String> l = new ArrayList<String>();的内容,则在编译过程中删除有关String的信息;JVM将不知道任何有关它的信息。
https://stackoverflow.com/questions/29036298
复制相似问题