Java中Generics泛型的功能简介说明
下文笔者讲述Generics泛型的简介说明
Generics泛型的简介
Generics是泛型的英文单词 泛型的核心目的: 参数化类型 将函数的参数进行类型化
泛型的优势
1.泛化:可使用泛型代表任意的类型 2.提高代码的复用性 3.类型安全性,由于泛型是在使用中指定类型,无需强制转换,所以非常安全 4.泛型可提高运行效率,使用泛型可减少对象的装箱和拆箱操作
泛型示例
泛型中常见的变量
T 类型(Type) K 键(Key) V 值(Value)
泛型类设计示例
class GenericsClass<T>{ private T date; public T getDate(){ return this.date; } public void setDate(T date){ this.date = date; } }
注意事项: 泛型类的类型参数可以是多个 如<K,V>,<T,K,V>等。
泛型接口
public interface GenericesInterface<T>{ public void setDate(T date); public T getDate(); }
泛型实现类
class GenericesImpl1 implements GenericesInterface<String>{ @Override public String getDate(){ return "String"; } public static void main(String[] args){ GenericesImpl a = new GenericesImpl(); System.out.println(a.getDate()); } } class GenericesImpl2<T> implements GenericesInterface<T>{ private T date; public void setDate(T date){ this.date = date; } @Override public T getDate(){ return date; } public static void main(String[] args) { GenericesImplTwo<String> a = new GenericesImplTwo<>(); a.setDate("String"); System.out.println(a.getDate()); } }
泛型方法
public <T> void genericesMethod(T date){ System.out.println(date); }
泛型通配符
上界通配符 <? extents Parent> 可以使用该类及其子类 下界通配符 <? super Child> 可以使用该类及其父类 无限制通配符 <?> 不限制类型
限定泛型类型变量
对类的限定: public class GenericesClass<T extends list & Serializable>{ ...... } 对方法的限定: public static<T extends List>T genericesMethod(T date) { ...... }
泛型擦除
泛型擦除: 指在编译阶段 将泛型替换为他的边界类型 即非限定类型变量替换为Object, 限定泛型类型则替换为第一个边界限定类型 如<T extends ArrayList>中T替换成ArrayList 虚拟机在运行阶段不识别泛型 泛型擦除本质上还是使用了类型的强制转换 不过由于编译阶段已经对数据进行过校验,保证数据的一致性 所以是一种比较安全的转换。
泛型不可协变
Number[] a = new Integer[8]; //正确 List<Number> a = new ArrayList<Integer>; //错误
泛型约束和局限性
泛型类不能实例化 基本数据类型不能作为泛型类型 无法使用instanceof关键字或==判断泛型类的类型 泛型类不能继承Exception或者Throwable 泛型参数是继承关系的泛型类之间是没有继承关系的
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。