Java 之 泛型擦除

Posted 格物致知_Tony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 之 泛型擦除相关的知识,希望对你有一定的参考价值。

泛型擦除

  在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但为了与老的 Java 代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定泛型参数,则该类型参数被称作一个原始类型(raw Type)。

  如果在使用泛型类或泛型接口的时候,没有指定泛型实参,会怎么样?(泛型擦除现象,泛型擦除后,泛型形参被解析为什么类型呢?)

  (1)如果没有指定泛型形参的上限,就按照 Object 处理;

  (2)如果指定泛型形参的上限,就按照上限处理,如果有多个上限,多个上限用&连接,按照最左边的第一个上限处理。

  Demo:

 1 public class TestErase {
 2     public static void main(String[] args) {
 3         //ArrayList<String>被转换为了ArrayList
 4         ArrayList list = new ArrayList<String>();
 5         list.add("Hello");
 6         list.add("World");
 7         //泛型被擦除,按照默认上限Object处理
 8         Object object = list.get(1);
 9         
10         Student s = new Student("张三",12);
11         
12         //泛型被擦除,按照第一个上限Number处理
13         Number score = s.getScore();
14     }
15 }
16 class Student<T extends Number & java.io.Serializable>{
17     private String name;
18     private T score;
19     public Student(String name, T score) {
20         super();
21         this.name = name;
22         this.score = score;
23     }
24     public T getScore() {
25         return score;
26     }
27 }

以上是关于Java 之 泛型擦除的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型擦除——以super关键字指定类型下限的在泛型擦除时会被擦成啥样的呢?

27.Android架构-泛型擦除机制

Java泛型擦除

java 泛型擦除 通配符? 的思考 T与?擦除,协变

Java 泛型使用上下边界通配符解决泛型擦除问题

泛型(10)-泛型擦除与转换