zoukankan      html  css  js  c++  java
  • 类型擦除

    1.概念

    泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。

    2.分类:

    • 无限制类型擦除

    代码演示:

     1 package com.genericity.demo5;
     2 
     3 public class Earase<T> {
     4     private T key;
     5 
     6     public T getKey() {
     7         return key;
     8     }
     9 
    10     public void setKey(T key) {
    11         this.key = key;
    12     }
    13 }
    View Code
     1 package com.genericity.demo5;
     2 
     3 import org.omg.PortableInterceptor.INACTIVE;
     4 
     5 import java.lang.reflect.Field;
     6 import java.util.ArrayList;
     7 
     8 public class Test2 {
     9     public static void main(String[] args) {
    10         Earase<Integer> integerEarase=new Earase<>();
    11         //利用反射,获取Earase类的字节码文件的class类对象
    12         Class<? extends Earase> aClass = integerEarase.getClass();
    13         Field[] declaredFields = aClass.getDeclaredFields();
    14         for (Field declaredField : declaredFields) {
    15             System.out.println(declaredField.getName()+":"+declaredField.getType().getSimpleName());
    16         }
    17     }
    18 }
    19 //运行结果:key:Object
    View Code
    • 有限制类型擦除

     

     1 package com.genericity.demo6;
     2 
     3 public class Earase<T extends  Number> {
     4     private T key;
     5 
     6     public T getKey() {
     7         return key;
     8     }
     9 
    10     public void setKey(T key) {
    11         this.key = key;
    12     }
    13 }
    View Code
     1 package com.genericity.demo6;
     2 
     3 import java.lang.reflect.Field;
     4 
     5 public class Test2 {
     6     public static void main(String[] args) {
     7         Earase<Integer> integerEarase=new Earase<>();
     8         //利用反射,获取Earase类的字节码文件的class类对象
     9         Class<? extends Earase> aClass = integerEarase.getClass();
    10         Field[] declaredFields = aClass.getDeclaredFields();
    11         for (Field declaredField : declaredFields) {
    12             System.out.println(declaredField.getName()+":"+declaredField.getType().getSimpleName());
    13         }
    14     }
    15 }
    16 //运行结果:key:Number
    View Code
    • 擦除方法中类型定义的参数

     1 package com.genericity.demo6;
     2 
     3 import java.util.List;
     4 
     5 public class Earase<T extends  Number> {
     6     private T key;
     7 
     8     public T getKey() {
     9         return key;
    10     }
    11 
    12     public void setKey(T key) {
    13         this.key = key;
    14     }
    15 
    16     /**
    17      * 泛型方法
    18      * @param t 参数也只能是List类型,或者是List类型的子类才行
    19      * @param <T>
    20      * @return
    21      */
    22     public <T extends List> T show(T t){
    23         return t;
    24     }
    25 }
    View Code
    1 Method[] declaredMethods = aClass.getDeclaredMethods();//获取类中的所有方法
    2         for (Method declaredMethod : declaredMethods) {
    3             System.out.println(declaredMethod.getName()+":"+declaredMethod.getReturnType().getSimpleName());
    4         }
    5         //运行结果:
    6         //getKey:Number
    7         //setKey:void
    8         //show:List
    View Code
    • 桥接方法

     

    1 package com.genericity.demo6;
    2 
    3 /**
    4  * 泛型接口
    5  * @param <T>
    6  */
    7 public interface Info<T> {
    8     T info(T t);
    9 }
    View Code
    1 package com.genericity.demo6;
    2 
    3 public class InfoImpl implements Info<Integer> {
    4     @Override
    5     public Integer info(Integer value) {
    6         return value;
    7     }
    8 }
    View Code
     1    InfoImpl info = new InfoImpl();
     2         Class<? extends InfoImpl> aClass1 = info.getClass();
     3         //当然,我们在获取类的字节码文件的时候,也可以直接使用.class的方式   Class<InfoImpl>  aClass1=InfoImpl.class
     4         Method[] declaredMethods1 = aClass1.getDeclaredMethods();
     5         for (Method method : declaredMethods1) {
     6             System.out.println(method.getName()+":"+method.getReturnType().getSimpleName());
     7         }
     8 
     9         //运行结果:
    10         //info:Integer
    11         //info:Object
    View Code
  • 相关阅读:
    操作系统相关知识点
    const define static extern
    Openstack neutron学习
    TensorFlow_Faster_RCNN中demo.py的运行(CPU Only)
    研一前的暑假,深度学习初体验
    List.remove()的使用注意
    iOS开发之多线程(NSThread、NSOperation、GCD)
    PS 滤镜算法原理——碎片效果
    【翻译】ExtJS vs AngularJS
    【翻译】在Ext JS 5应用程序中如何使用路由
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/15662521.html
Copyright © 2011-2022 走看看