泛型擦除

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  (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 }
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄