网站建设升级,东莞市人力资源网官网,idc销售网站php源代码,好发网站建设文章目录泛型的概念集合中使用泛型自定义泛型结构泛型在继承上的体现通配符的使用泛型的概念
集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象#xff0c;所以在JDK1.5之前只能把元素类型设计为Object#xff0c;JDK1.5之后使用泛型来解决。因为这个…
文章目录泛型的概念集合中使用泛型自定义泛型结构泛型在继承上的体现通配符的使用泛型的概念
集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象所以在JDK1.5之前只能把元素类型设计为ObjectJDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定其他的部分是确定的例如关于这个元素如何保存如何管理等是确定的因此把元素的类型设计成一个参数这个类型参数叫做泛型。CollectionEArrayListE 中E就是类型参数即泛型。
所谓泛型就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时例如继承或实现这个接口用这个类型声明变量、创建对象时确定即传入实际的类型参数也称为类型实参。
从JDK1.5以后Java引入了“参数化类型Parameterized type”的概念允许在创建集合时再指定集合元素的类型正如ListString这表明该List只能保存字符串类型的对象。JDK1.5改写了集合框架中的全部接口和类为这些接口、类增加了泛型支持从而可以在声明集合变量、创建集合对象时传入类型实参。 集合中使用泛型
Collection中使用泛型
import java.util.ArrayList;
import java.util.Iterator;/*** Author: Yeman* Date: 2021-09-24-15:10* Description:*/
public class GenericTest {public static void main(String[] args) {//如下在实例化的时候在中填入需要的类型即可不可以是基本数据类型ArrayListInteger list new ArrayList();list.add(99);list.add(0);list.add(121);//遍历方式一for (Integer integer : list){System.out.println(integer);}System.out.println();//遍历方式二IteratorInteger iterator list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}Map中使用泛型
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*** Author: Yeman* Date: 2021-09-24-15:10* Description:*/
public class GenericTest {public static void main(String[] args) {//如下如下在实例化的时候在中填入需要的类型即可不可以是基本数据类型// 注意因为Map是键值对因此需要分别填入“键”和“值”所需要的类型HashMapString, Integer map new HashMap();map.put(Jack,26);map.put(Marry,18);map.put(Tom,20);map.put(Lily,22);SetMap.EntryString, Integer entries map.entrySet();IteratorMap.EntryString, Integer iterator entries.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}自定义泛型结构
1、泛型类、泛型接口
①泛型的声明 interface ListT{} 、 class GenTestK,V{} 、class student T extends Person {} 其中TKV不代表值而是表示类型。这里使用任意字母都可以常用T表示是Type的缩写。
②泛型的实例化
ListString strList new ArrayListString();IteratorCustomer iterator customers.iterator();里面只能是类不能用基本数据类型填充可以使用包装类填充。把一个集合中的内容限制为一个特定的数据类型这就是Generic的核心思想。
泛型类可能有多个参数此时可将多个参数一起放在尖括号内如E1,E2,E3
泛型类的构造器与非泛型一样public GenericClass(){} 而public GenericClassE(){}是错误的。
泛型不同的引用不能相互赋值尽管在编译时ArrayListString和ArrayListInteger是两种类型但是在运行时只有一个ArrayList被加载到JVM中。
在类/接口上声明的泛型在本类或本接口中即代表某种类型可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型因为静态成员是随着类加载而加载的而类型的指定是在实例化时才确定的。
异常类不能使用泛型。
不能new E[]但是可以E[] elements (E[])new Object[capacity];。
父类有泛型子类可以选择保留泛型也可以选择指定泛型类型子类除了指定或保留父类的泛型还可以增加自己的泛型
class FatherT1, T2 {
}
// 子类不保留父类的泛型
// 1)没有类型 擦除
class Son1 extends Father {// 等价于class Son extends FatherObject,Object{
}
// 2)指定类型
class Son2 extends FatherInteger, String {
}
// 子类保留父类的泛型
// 1)全部保留
class Son3T1, T2 extends FatherT1, T2 {
}
// 2)部分保留
class Son4T2 extends FatherInteger, T2 {
}class FatherT1, T2 {
}
// 子类不保留父类的泛型
// 1)没有类型 擦除
class SonA, B extends Father{//等价于class Son extends FatherObject,Object{
}
// 2)具体类型
class Son2A, B extends FatherInteger, String {
}
// 子类保留父类的泛型
// 1)全部保留
class Son3T1, T2, A, B extends FatherT1, T2 {
}
// 2)部分保留
class Son4T2, A, B extends FatherInteger, T2 {
}class PersonT {// 使用T类型定义变量private T info;// 使用T类型定义一般方法public T getInfo() {return info;}public void setInfo(T info) {this.info info;}// 使用T类型定义构造器public Person() {}public Person(T info) {this.info info;}
} 2、泛型方法
方法也可以被泛型化不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数此时参数的类型就是传入数据的类型。
访问权限 是否为静态 泛型 返回类型 方法名(泛型标识 参数名称,...) 异常{//方法体
}public class Test {public E E get(int id, E[] arry) {E result null;return result;}
}泛型在继承上的体现
如果B是A的一个子类型子类或者子接口而G是具有泛型声明的类或接口GB并不是GA的子类型比如String是Object的子类但是ListString并不是ListObject的子类不能相互赋值。而反过来如下是可以的
ArrayListString arrayList new ArrayList();
ListString list arrayList;通配符的使用
1、使用
比如List? Map?,? List?是ListString、ListObject等各种泛型List的父类。
读取List?的对象list中的元素时永远是安全的因为不管list的真实类型是什么都包含于Object。而不能向其中添加写入对象。除了null因为它是所有类型的成员
Collection? c new ArrayListString();
c.add(new Object()); // 编译时错误public static void main(String[] args) {List? list null;list new ArrayListString();list new ArrayListDouble();list.add(3);//编译不通过编译时错误list.add(null);ListString l1 new ArrayListString();ListInteger l2 new ArrayListInteger();l1.add(AABBCC);l2.add(9);read(l1);read(l2);
}
public static void read(List? list) {for (Object o : list) {System.out.println(o);}
}2、有限制的通配符
①? 允许所有泛型的引用调用
②通配符指定上限 extends使用时指定的类型必须是继承某个类或者实现某个接口即。 ? extends Number (无穷小 , Number]只允许泛型为Number及Number子类的引用调用。? extends Comparable只允许泛型为实现Comparable接口的实现类的引用调用。
③通配符指定下限 下限super使用时指定的类型不能小于操作的类即。 ? super Number [Number , 无穷大)只允许泛型为Number及Number父类的引用调用。