美文网首页
Java泛型的类型擦除,声明了不同泛型的list可以的Class

Java泛型的类型擦除,声明了不同泛型的list可以的Class

作者: 王跃琅 | 来源:发表于2022-09-11 07:50 被阅读0次

奇怪的代码

第一个

List<String> l1 = new ArrayList<>();
List<Integer> l2 = new ArrayList<>();
System.out.println(l1.getClass() == l2.getClass());

这段代码的输出结果如下:


image.png

第二个

@Test
public void anyTestHere() throws InterruptedException {
    List<String> ls = new ArrayList<>();
    ls.add("Hello Java");
    List l = ls;
    List<Integer> li = l;
    System.out.println(li.get(0));
}

这段代码的输出结果如下:


image.png

看了之后就不理解了,脑袋里冒出无数个why,对不对?下面来了解一下泛型的类型擦除。

泛型的类型擦除

泛型只是在程序的编译阶段起作用,运行时JVM并不会理会泛型,全部按Object进行处理。
写个代码简单看一下:

  1. 写一个泛型类:
class Generics<T> {
    private T field;
    public T getField() {
        return field;
    }
    public void setField(T field) {
        this.field = field;
    }
}
  1. 获取类的类型和属性的类型:
@Test
public void test() {
    Generics<String> generics = new Generics<>();
    System.out.println(generics.getClass());
    Field[] declaredFields = generics.getClass().getDeclaredFields();
    for (Field declaredField : declaredFields) {
        System.out.println(declaredField.getType().getName());
    }
}
  1. 输出结果如下:
class com.test.test.service.Generics
java.lang.Object

可以看到,类的类型并没有提现泛型相关的内容,属性的类型则是Object。

如何限制类型擦除

那如果就想限制死类型怎么办?可以使用extends指定泛型上限:

class Generics<T extends String> {
    private T field;
    public T getField() {
        return field;
    }
    public void setField(T field) {
        this.field = field;
    }
}

限制了泛型的上限之后,再看一下泛型属性的类型,代码和输出结果如下:


image.png

可以看到,泛型类的属性的类型变成了String,这样就可以限制泛型的类型擦除了。

相关文章

  • 【进阶之路】Java的类型擦除式泛型

    【进阶之路】Java的类型擦除式泛型 Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Jav...

  • ★13.泛型

    关于泛型 静态方法无法访问泛型的类型参数。(C++可以) Java泛型使用擦除实现,如运行时,List ,List...

  • Java泛型的类型擦除,声明了不同泛型的list可以的Class

    奇怪的代码 第一个 这段代码的输出结果如下: 第二个 这段代码的输出结果如下: 看了之后就不理解了,脑袋里冒出无数...

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • 泛型

    泛型用于编译时期,确保类型的安全 在运行时,会将泛型去掉,class文件是不带泛型的,这个称为泛型的擦除,擦除是为...

  • Java如何在运行时获取泛型的类型

    Java泛型是伪泛型,会在编译完成时进行类型的擦除,我们无法在运行时获取泛型参数的具体类型(类型擦除会被替换成泛型...

  • Java的泛型类型擦除及类型擦除带来的问题

    1、泛型的类型擦除 Java的泛型是伪泛型,不同于C++的模板机制,这是因为Java的泛型只存在编译期间,在编译完...

  • Java 泛型之类型擦除和通配符PECS原则

    类型擦除 泛型是Java 5才引入的特性,在这之前,并没有泛型,所以Java的泛型和C++的不一样,是通过类型擦除...

  • JAVA泛型和类型擦除

    什么是类型擦除 Java是使用擦除来实现泛型的。使用泛型后在运行时任何具体的类型信息都被擦除了,关于泛型的处理都是...

  • java泛型

    java的泛型是"伪泛型",为什么这么说。因为泛型只是作用在编译之前,编译之后,泛型都被擦除了(类型擦除)。所以说...

网友评论

      本文标题:Java泛型的类型擦除,声明了不同泛型的list可以的Class

      本文链接:https://www.haomeiwen.com/subject/jckvbrtx.html