类型擦除的简单理解

  • 泛型是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());
        }
    }
}

  1. 类型擦除后,两个属性的类型都是为 Object类型。
  2. 在泛型类被类型擦除的时候,之前泛型类中的类型参数如果没有指定上限,如则会被转成普通的Object类型,如果指定了上限如,则类型参数就会被替换成类型上限。

举例:有上限类型

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

你可能感兴趣的:(Java)