- 泛型是JDK1.5引进的。?
- 泛型信息只存在编译阶段,在进入JVM之前,与泛型相关的信息会被擦除。通俗来讲,泛型类和普通类在java虚拟机内没有什么特别的地方。
举例1:说明类型擦除
public class TestMessage{
public static void main(String[] args) {
Message<String> message = new Message<>();
Message<Integer> message1 = new Message<>();
System.out.println(message.getClass() == message1.getClass()); //true
System.out.println(message.getClass().getName()); //www.csdn.point.Message
System.out.println(message1.getClass().getName()); //www.csdn.point.Message
}
}
class Message<T> {
private T message;
public void setMessage(T message){
this.message = message;
}
public T getMessage(){
return this.message;
}
@Override
public String toString() {
return "TestMessage{" +
"message=" + message +
'}';
}
}
以上结果中表明他们两个的类型都一致,类型擦除后都是Message 。
举例2:类型擦除后,查看字段信息
//当使用泛型类时,决定属性的具体类型
public class Point2<T> {
private T x;
private T y;
public void setX(T x) {
this.x = x;
}
public T getX(){
return x;
}
public void setY(T y) {
this.y = y;
}
public T getY() {
return y;
}
@Override
public String toString() {
return "Point2{" +
"x=" + x +
", y=" + y +
'}';
}
public static void main(String[] args) {
Point2<Integer> p2 = new Point2<>();
//两个属性
Field[] fields = p2.getClass().getDeclaredFields();
for (Field field:fields){
System.out.println(field.getType().getName());
}
}
}
- 类型擦除后,两个属性的类型都是为 Object类型。
- 在泛型类被类型擦除的时候,之前泛型类中的类型参数如果没有指定上限,如
<T>
则会被转成普通的Object类型,如果指定了上限如<T extends String>
,则类型参数就会被替换成类型上限。
举例:有上限类型
public class Point6 <T extends CharSequence>{
private T x;
private T y;
public void setX(T x){
this.x = x;
}
public T getX(){
return this.x;
}
public void setY(T y){
this.y = y;
}
public T getY(){
return this.y;
}
@Override
public String toString() {
return "Point6{" +
"x=" + x +
", y=" + y +
'}';
}
public static void main(String[] args) {
Point6<String> p1 = new Point6<>();
//两个属性
Field[] fields = p1.getClass().getDeclaredFields();
for(Field field: fields){
System.out.println(field.getType().getName()); //java.lang.CharSequence
}
}
}
以上结果中,两个属性x, y 的类型都是CharSequence。