[

](Java%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B9%9D%EF%BC%89%E2%80%94%E2%80%94%E6%B3%9B%E5%9E%8B)

1 泛型

  • 传入的必须是类或接口,不能是基本数据类型如int.
  • 没有传入就默认使用Object
  • 静态成员不能使用泛型

1.1 泛型类的简单例子

  • 泛型在创建对象时确定
  1. public static void main(String[] args) {
  2. Person<String> person = new Person<String>("Curry");
  3. person.show(); //String
  4. Person<Integer> person2 = new Person<Integer>(100);
  5. person2.show();//Integer
  6. }
  7. class Person<E> {
  8. E s ;//E表示 s的数据类型, 该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型
  9. public Person(E s) {//E也可以是参数类型
  10. this.s = s;
  11. }
  12. public E f() {//返回类型使用E
  13. return s;
  14. }
  15. public void show() {
  16. System.out.println(s.getClass());//显示s的运行类型
  17. }
  18. }

1.2 泛型接口的简单例子

  • 泛型接口的类型, 在继承接口或者实现接口时确定
  • 没有指定类型,默认为Object
  1. interface IUsb<U, R> {
  2. int n = 10;
  3. //U name; 不能这样使用
  4. //普通方法中,可以使用接口泛型
  5. R get(U u);
  6. void hi(R r);
  7. void run(R r1, R r2, U u1, U u2);
  8. //在jdk8 中,可以在接口中,使用默认方法, 也是可以使用泛型
  9. default R method(U u) {
  10. return null;
  11. }
  12. }

1.3 泛型方法的简单例子

  • 在调用方法时传入参数,编译器会自动确定类型。
  1. public class CustomMethodGeneric {
  2. public static void main(String[] args) {
  3. Car car = new Car();
  4. car.fly("宝马", 100);//当调用方法时,传入参数,编译器,就会确定类型
  5. System.out.println("=======");
  6. car.fly(300, 100.1);//当调用方法时,传入参数,编译器,就会确定类型
  7. //测试
  8. //T->String, R-> ArrayList
  9. Fish<String, ArrayList> fish = new Fish<>();
  10. fish.hello(new ArrayList(), 11.3f);
  11. }
  12. }
  13. //泛型方法,可以定义在普通类中, 也可以定义在泛型类中
  14. class Car {//普通类
  15. public void run() {//普通方法
  16. }
  17. //说明 泛型方法
  18. //1. <T,R> 就是泛型
  19. //2. 是提供给 fly使用的
  20. public <T, R> void fly(T t, R r) {//泛型方法
  21. System.out.println(t.getClass());//String
  22. System.out.println(r.getClass());//Integer
  23. }
  24. }
  25. class Fish<T, R> {//泛型类
  26. public void run() {//普通方法
  27. }
  28. public<U,M> void eat(U u, M m) {//泛型方法
  29. }
  30. //说明
  31. //1. 下面hi方法不是泛型方法
  32. //2. 是hi方法使用了类声明的 泛型
  33. public void hi(T t) {
  34. }
  35. //泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型
  36. public<K> void hello(R r, K k) {
  37. System.out.println(r.getClass());//ArrayList
  38. System.out.println(k.getClass());//Float
  39. }
  40. }

1.4 形参上的泛型

  • <?> :可以传入任何类
  • <? extends A> :可以传入A及A的子类
  • <? super A> :可以传入A及A的父类
  1. public static void printCollection2(List<? extends AA> c) {
  2. for (Object object : c) {
  3. System.out.println(object);
  4. }
  5. }
  6. //说明: List<?> 表示 任意的泛型类型都可以接受
  7. public static void printCollection1(List<?> c) {
  8. for (Object object : c) { // 通配符,取出时,就是Object
  9. System.out.println(object);
  10. }
  11. }
  12. // ? super 子类类名AA:支持AA类以及AA类的父类,不限于直接父类,
  13. //规定了泛型的下限
  14. public static void printCollection3(List<? super AA> c) {
  15. for (Object object : c) {
  16. System.out.println(object);
  17. }
  18. }