湖州网站开发区火炬手,网站建设技术参数,谁在万网建设的网站,wordpress 花园Java泛型的局限和使用经验
泛型的局限
任何基本类型不能作为类型参数
经过类型擦除后#xff0c;List中包含的实际上还是Object的域#xff0c;而在Java类型系统中Object和基本类型是两套体系#xff0c;需要通过“自动装包、拆包机制”来进行交互。
2.任何在运行时需要…
Java泛型的局限和使用经验
泛型的局限
任何基本类型不能作为类型参数
经过类型擦除后List中包含的实际上还是Object的域而在Java类型系统中Object和基本类型是两套体系需要通过“自动装包、拆包机制”来进行交互。
2.任何在运行时需要知道确切类型信息的操作都无法工作。
由于Java的泛型是编译期泛型在进入运行时后没有泛型的概念因此运行时的类型转换和类型判定等操作都没有效果。
3.冲突1方法名一样参数列表是同一个类型参数的两个泛型方法重载将产生相同的函数签名
在泛型擦除后这两个方法签名完全相同产生冲突
4.冲突2使用泛型接口时需要避免重复实现同一个接口
5.不能在静态域或方法中引用类型参数
在方法的签名里多了一个static关键字然后引发编译错误的原因就变成了在静态域中无法引用类型变量
泛型的常用经验
尽量消除异常初学者容易写出使用原生类型的代码或者使用泛型不当的代码现在编辑器非常先进尽量消除提示的异常对于开发者自己确认不需要消除切可以工作的代码可以使用SuppressWarnings(unchecked)屏蔽掉异常能用泛型类或接口的时候尽量使用能用泛型方法的时候尽量使用泛型方法定义API时尽量使用泛型 泛型的概述 泛型参数化类型
类型形参TEKVUR。。。。
类型实参必须是引用数据类型不能是基本数据类型 StringIntegerStudentArrayListString……
形式一泛型类与泛型接口 1、声明语法格式
【修饰符】 class 类名/接口类型形参列表{ } 【修饰符】 class 类名/接口类型形参1 extends 父类上限{ } 【修饰符】 class 类名/接口类型形参1 extends 父类上限 父接口上限{ } 在类名或接口名后面声明的泛型形参类型可以在当前类或接口中使用用作声明成员变量、方法的形参、方法的返回值。
但是不能用于静态成员上
2、使用语法格式
在1创建泛型类、泛型接口的对象时为泛型形参指定具体类型 2在继承泛型类或实现泛型接口时为泛型形参指定具体类型
示例代码
ArrayListString list new ArrayListString(); ArrayListString list new ArrayList();//JDK1.7之后可以省略 class MyStringArrayList extends ArrayListString{ } class Employee implements ComparableEmployee{ public int compareTo(Employee e){ } } Arrays.sort(数组, new Comparator泛型实参(){ public int compare(泛型实参类型 o1, 泛型实参类型 o2){ } });
3、泛型如果没有指定会被擦除按照最左边的上限处理如果没有指定上限按照Object处理
形式二泛型方法 1、声明的语法格式
【修饰符】 泛型形参列表 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{}
【修饰符】 泛型形参 extends 父类上限 父接口上限 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{} 1在方法返回值类型前面声明的泛型形参类型只能在当前方法中使用用于表示形参的类型或返回值类型或方法局部变量的类型和别的方法无关。
2泛型方法可以是静态方法也可以是非静态方法
2、 使用
当调用方法会根据具体的数据的实参的类型来确定泛型实参的类型。
通配符 1?代表任意引用数据类型
2? extends 上限代表上限本身或它的子类
3? super 下限代表下限本身或它的父类
例如
ArrayList?表示可以接受任意类型
ArrayList? list new ArrayListString(); ArrayList? list new ArrayListInteger(); ArrayList? list new ArrayListAnimal(); ArrayList? extends 上限
ArrayList? extends Person list new ArrayListPerson(); ArrayList? extends Person list new ArrayListAnimal();//Animal不行因为Animal是父类 ArrayList? extends Person list new ArrayListStudent(); ArrayList? extends Person list new ArrayListDog();//Dog也不行 ArrayList? super 下限
ArrayList? super Person list new ArrayListPerson(); ArrayList? super Person list new ArrayListAnimal(); ArrayList? super Person list new ArrayListStudent();//Student因为Student是子类 ArrayList? super Person list new ArrayListDog();//Dog也不行 ArrayList?不能添加元素除了null
ArrayList? extends 上限不能添加元素除了null
ArrayList? super 下限可以添加下限或下限子类的对象 Collections工具类 java.util.Collections工具类操作集合
1public static T boolean addAll(Collection? super T c, T... elements)
添加elements的几个对象到c集合中。T是elements对象的类型要求Collection集合的元素类型必须是T或T的父类
2public static T int binarySearch(List? extends Comparable? super T list,T key)
在list集合中用二分查找key的下标如果存在返回的是合理的下标如果不存在返回的是一个负数下标
T是元素的类型
? extends Comparable? super T要求集合的元素必须实现Comparable接口
? super T在实现Comparable接口可以指定Comparable类型实参为T或T的父类。
3public static boolean disjoint(Collection? c1, Collection? c2)
判断c1和c2没有交集就为true
4public static T extends Object Comparable? super T T max(Collection? extends T coll)
求coll集合中最大元素
T extends Object Comparable? super T要求T或T的父类实现Comparable接口
5public static T extends Comparable? super T void sort(ListT list) 给list集合排序
T extends Comparable? super T要求T或T的父类实现Comparable接口
6public static T CollectionT synchronizedCollection(CollectionT c)
以synchronizedXX开头的方法表示把某种非线程安全集合转为一个线程安全的集合。
7public static T ListT unmodifiableList(List? extends T list)