泛型Genericity
泛型:可以在类或方法中预支地使用未知的类型。
注意: 一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
E - Element | (在集合中使用,因为集合中存放的是元素) * |
T - Type | (Java 类) |
K - Key | (键) |
V - Value | (值) |
N - Number | (数值类型) |
定义泛型:
编写的类,或者方法上, 灵活性更高, 类操作的数据类型不在由编写者确定, 预知未知的数据类型,
当使用者创建这个类的对象的时候, 由使用者根据他的需求, 确定数据类型不使用Object,
1. 获取数据, 返回的Object类型, 需要进行类型转换, 可能出现ClassCastException
2. 实际中, 集合操作的一组数据, 数据类型都是一样
【注意点】
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型
类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化
泛型的定义:
1. 在类上定义泛型
2. 在方法上定义泛型
3. 在接口上定义泛型
类中的泛型
public class GenericDemo1<T>{ //在类中使用这个泛型变量, 属性的数据类型 // 返回的返回值, 返回的参数 //定义一个属性 private T info; // 属性的数据类型: T的是什么. 数据类型就是什么 //在方法上使用, 使用泛型变量作为返回值类型 public T fun1(){ return info; } //在方法的参数上使用 public void fun2(T param){ System.out.println("我是fun2()方法, 我的参数是:"+param); } }
方法中的泛型
public class GenericDemo2 { //在方法上声明泛型 public <T> String fun1(T t){ return "fun1"; } // 静态方法上使用泛型, 声明泛型变量, <E> 写static后面 public static <E> void fun3(E str){ } // public void fun2(T t){ 错误 // // } }
接口中的泛型
//泛型接口 public interface GenericInterface<E> { public void fun1(E e); } //实现类一 //实现类, 给接口的泛型变量赋一个数据类型: String public class GenericInterfaceImpl implements GenericInterface<String>{ @Override public void fun1(String e) { } } //实现类二 // 子类(子接口) 变成一个泛型类 public class GenericInterfaceImpl2<E> implements GenericInterface<E> { @Override public void fun1(E e) { } public static void main(String[] args) { //创建对象: GenericInterfaceImpl2<String> gi = new GenericInterfaceImpl2<>(); gi.fun1("haha"); } }
泛型通配符 ?
public class Genericity_? { public static void main(String[] args) { //使用泛型创建list List<String> list=new ArrayList<>(); list.add("abc"); list.add("abb"); list.add("cba"); List<Integer> list1=new ArrayList<>(); list1.add(123); list1.add(234); list1.add(456); //调用打印list方法 printList(list); printList(list1); // 这个方法 接收任意的数据类型元素的 List集合, 有一个警告, 参数List 使用泛型 // List<String> 但是list只能接收 元素是String的List集合 // List<Object> 注意: 泛型中,没有继承的关系 List<Object> list = new ArrayList<String>(); 错误 // 泛型变量 // ? 代表泛型变量是任意数据类型, 只能接收数据, 不能存储数据 // 限制? 范围 ? extends 类名A 上限 传递的数据类型 A类或者是A类的子类 理解 // ? super 类名A 下限: 传递的数据类型 A类或者A类的父类 } //打印list方法 public static void printList(List<?> list){// <? super Number> <? extends Number> System.out.println(list); } }