泛型的语法
-
泛型的声明
interface接口< T >{}和class 类 <K,V>{}
- 其中T,K,V代表类型
- 任意字母都可以
-
泛型的实例化
要在类名后面指定类型参数的值
eg:
- List< String > strlist = new ArrayList< String >();
- Iterator< Customer > iterator = customer.iterator
/** *泛型使用实例 */ public class GenericExercise { public static void main(String[] args) { HashSet<Student> students = new HashSet<Student>(); students.add(new Student("jack", 18)); students.add(new Student("tom", 28)); students.add(new Student("mary", 19)); for (Student student : students) { System.out.println(student); } HashMap<String, Student> hm = new HashMap<String, Student>(); hm.put("milan", new Student("milan", 38)); hm.put("smith", new Student("smith", 48)); hm.put("hsp", new Student("hsp", 28)); Set<Map.Entry<String, Student>> entries = hm.entrySet(); Iterator<Map.Entry<String, Student>> iterator = entries.iterator(); System.out.println("=============================="); while (iterator.hasNext()) { Map.Entry<String, Student> next = iterator.next(); System.out.println(next.getKey() + "-" + next.getValue()); } } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
泛型使用的注意事项和细节
-
interface List< T>{ , public class HashSet< E>()… 等等
说明:T,E只能是引用类型
看看下面语句是否正确?:
List< Integer > list=new ArrayList< Integer>0:/
List< int> list2 = new ArrayList< int>0://错误 -
在给泛型指定具体类型后,可以传入该类型或者其子类类型
-
泛型使用形式
List< Integer> list1 = new ArrayList< Integer>0;
List< Integer> list2=new ArrayList<>();[说明:]
如果我们这样写 List list3=new ArrayList();默认给它的泛型是[<E>E就是 Object]
/** *泛型注意事项 */ public class GenericDetail { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); Pig<A> aPig = new Pig<A>(new A()); aPig.f(); Pig<A> aPig2 = new Pig<A>(new B()); aPig2.f(); ArrayList<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<Integer>(); ArrayList<Integer> list3 = new ArrayList<>(); List<Integer> list4 = new ArrayList<>(); ArrayList<Pig> pigs = new ArrayList<>(); ArrayList arrayList = new ArrayList(); Tiger tiger = new Tiger(); } } class Tiger<E> { E e; public Tiger() {} public Tiger(E e) { this.e = e; } } class A {} class B extends A {} class Pig<E> { E e; public Pig(E e) { this.e = e; } public void f() { System.out.println(e.getClass()); } }
自定义泛型类
-
基本语法
class类名<T,R…>{}
-
注意细节
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组,不能初始化
- 静态方法中不能使用类的泛型
- 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
- 如果在创建对象时,没有指定类型,默认为Object
/** *泛型基本使用 */ public class CustomGeneric_ { public static void main(String[] args) { Tiger<Double,String,Integer> g = new Tiger<>("john"); g.setT(10.9); System.out.println(g); Tiger g2 = new Tiger("john~~"); g2.setT("yy"); System.out.println("g2=" + g2); } } class Tiger<T, R, M> { String name; R r; M m; T t; T[] ts; public Tiger(String name) { this.name = name; } public Tiger(R r, M m, T t) { this.r = r; this.m = m; this.t = t; } public Tiger(String name, R r, M m, T t) { this.name = name; this.r = r; this.m = m; this.t = t; } } public String getName() { return name; } public void setName(String name) { this.name = name; } public R getR() { return r; } public void setR(R r) { this.r = r; } public M getM() { } public void setM(M m) { his.m = m; } public T getT() { return t; } public void setT(T t) { this.t = t; } @Override public String toString() { return "Tiger{" + "name='" + name + '\'' + ", r=" + r + ", m=" + m + ", t=" + t + ", ts=" + Arrays.toString(ts) + '}'; } }
-
自定义泛型接口
-
基本语法
interface接口名<T,R…>{}
-
注意细节
- 接口中,静态成员也不能使用泛型(和泛型类规定一样)
- 泛型接口的类型,在继承接口或者实现接口时确定
- 没有指定类型,默认为Object
/** *自定义泛型接口 */ interface IA extends IUsb<String, Double> { } class AA implements IA { @Override public Double get(String s) { return null; } @Override public void hi(Double aDouble) { } @Override public void run(Double r1, Double r2, String u1, String u2) { } } class BB implements IUsb<Integer, Float> { @Override public Float get(Integer integer) { return null; } @Override public void hi(Float aFloat) { } @Override public void run(Float r1, Float r2, Integer u1, Integer u2) { } } class CC implements IUsb { { @Override public Object get(Object o) { return null; } @Override public void hi(Object o) { } @Override public void run(Object r1, Object r2, Object u1, Object u2) { } } interface IUsb<U, R> { int n = 10; R get(U u); void hi(R r); void run(R r1, R r2, U u1, U u2); default R method(U u) { return null; } }
-
-
自定义泛型方法
-
基本语法
修饰符<T,R…>返回类型方法名(承诺列表)
-
注意细节
-
泛型方法,可以定义在普通类中,也可以定义在泛型类中
-
当泛型方法被调用时,类型会确定
-
public void eat(E e){},修饰符后没有<T,R…> eat 方法不是泛型方法,而是使用了泛型
/** *泛型注意细节 */ public class CustomMethodGeneric { public static void main(String[] args) { Car car = new Car(); car.fly("宝马", 100); System.out.println("======="); car.fly(300, 100.1); Fish<String, ArrayList> fish = new Fish<>(); fish.hello(new ArrayList(), 11.3f); } } class Car { public void run() { } public <T, R> void fly(T t, R r) { System.out.println(t.getClass()); System.out.println(r.getClass()); } } class Fish<T, R> { public void run() { } public<U,M> void eat(U u, M m) { } public void hi(T t) { } public<K> void hello(R r, K k) { System.out.println(r.getClass()); System.out.println(k.getClass()); } }
-
-
泛型的继承和通配符
-
泛型的继承和通配符说明
-
泛型不具备继承性
- <?>:支持任意泛型类型
- <?extends A>:支持A类以及A类的子类,规定了泛型的上限
- <?super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
/** *泛型的继承 */ public class GenericExtends { public static void main(String[] args) { Object o = new String("xx"); List<Object> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); List<AA> list3 = new ArrayList<>(); List<BB> list4 = new ArrayList<>(); List<CC> list5 = new ArrayList<>(); printCollection1(list1); printCollection1(list2); printCollection1(list3); printCollection1(list4); printCollection1(list5); printCollection2(list3); printCollection2(list4); printCollection2(list5); printCollection3(list1); printCollection3(list3); } public static void printCollection2(List<? extends AA> c) { for (Object object : c) { System.out.println(object); } } public static void printCollection1(List<?> c) { for (Object object : c) { System.out.println(object); } } public static void printCollection3(List<? super AA> c) { for (Object object : c) { System.out.println(object); } } } class AA { } class BB extends AA { } class CC extends BB { }
-