1、介绍分析

  • 泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的()运行阶段没作用
  • 使用了泛型的好处是什么?
    • 集合中存储的元素统一了
    • 从集合取出的元素类型是泛型指定的类型,不需要大量的向下转型(不需要强制类型转换,直接调用)
  • 泛型的缺点是什么
    • 导致集合中存储的元素缺乏多样性
    • 大多数业务中,集合中元素的类型统一,所以这种泛型特性被大家认可
  • 不用泛型就是Object类型 ```java

    如果不使用泛型

    package generic;

import javafx.animation.Animation;

import java.util.ArrayList; import java.util.Iterator;

public class Demo01 { public static void main(String[] args) { ArrayList mylist = new ArrayList();

  1. Bird b = new Bird();
  2. Cat c = new Cat();
  3. mylist.add(b);
  4. mylist.add(c);
  5. // 不使用泛型的时候调用

// Iterator it = mylist.iterator(); // while (it.hasNext()){ // Object obj = it.next(); // Anamil animail = (Anamil) obj; // animail.move(); // }

  1. // 使用泛型的时候调用
  2. }

}

class Anamil{ public void move(){ System.out.println(“动物在移动!”); } }

class Cat extends Anamil{ public void catchMouse(){ System.out.println(“猫在老鼠!”); } }

class Bird extends Anamil{ public void fly(){ System.out.println(“鸟儿在空中飞翔!”); } }

使用泛型

ArrayList mylist = new ArrayList(); // 添加的元素只能是Animail类型 … Iterator it = mylist.iterator(); while (it.hasNext()){ Anamil animail = it.next(); animail.move(); }

  1. <a name="WV84x"></a>
  2. ### 2、自动类型推断机制(钻石表达式)
  3. ```java
  4. package generic;
  5. import java.util.ArrayList;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. /*
  9. 自动类型推断机制(又称为钻石表达式),jdk8之后才允许
  10. */
  11. public class Demo02 {
  12. public static void main(String[] args) {
  13. List<Anamil> mylist = new ArrayList<>();
  14. mylist.add(new Cat());
  15. mylist.add(new Bird());
  16. Iterator<Anamil> it = mylist.iterator();
  17. while(it.hasNext()){
  18. Anamil animail = it.next();
  19. animail.move();
  20. }
  21. List<String> mystr = new ArrayList<>();
  22. mystr.add("a");
  23. mystr.add("b");
  24. Iterator<String> itstr = mystr.iterator();
  25. while(itstr.hasNext()){
  26. String str = itstr.next();
  27. System.out.println(str);
  28. }
  29. }
  30. }

3、自定义泛型

  • <>中的是一个标识符,随便写
  • 源码中经常出现的
    • E -> Element
    • T -> Type
    • <?Extends> ```java package generic;

public class Demo03 { public void doSome(T o){ System.out.println(o); }

  1. public static void main(String[] args) {
  2. Demo03<String> d = new Demo03<>();
  3. d.doSome("abc");
  4. }

} ```