Java中集合的泛型指定及泛型的自定义

缺乏、安全感 2023-02-28 01:23 31阅读 0赞

关于jdk5.0之后的新特性:泛型机制

1、泛型这种语法机制,只是在程序编译阶段给编译器看的,运行阶段不起作用。


2、泛型在集合中的作用:
当用集合中使用泛型指定之后,说明该集合只能存储这种类型的元素,当你想存储其他元素的时候,编译器会报错。


3、为什么在集合中使用泛型?
因为大多数情况下,我们只会在集合中存储同一类型的对象。


测试代码:

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. public class Test09 {
  5. public static void main(String[] args) {
  6. // 创建集合对象,不使用泛型的情况下,分析程序
  7. List myList = new ArrayList(20);
  8. // 准备对象元素
  9. Bird b = new Bird();
  10. Dog d = new Dog();
  11. int i = 100;
  12. String str = "hello";
  13. // 添加元素
  14. myList.add(b);
  15. myList.add(d);
  16. myList.add(i);
  17. myList.add(str);
  18. System.out.println(myList.size()); // 4
  19. // 遍历集合对象,让动物对象调用移动方法
  20. Iterator it = myList.iterator();
  21. while (it.hasNext()) {
  22. Object obj = it.next();
  23. // 你不知道对象是什么类型,所以只能判断是不是动物
  24. if (obj instanceof Animal) {
  25. Animal animal = (Animal)obj;
  26. animal.move();
  27. }
  28. }
  29. // 当使用泛型之后
  30. List<Animal> list = new ArrayList<Animal>(20);
  31. //list.add(1);
  32. //list.add("abc"); // 编译器报错,说list只能存储Animal类型
  33. Bird b1 = new Bird();
  34. Dog d1 = new Dog();
  35. list.add(b1);
  36. list.add(d1);
  37. System.out.println(list.size()); // 2
  38. Iterator<Animal> it1 =list.iterator(); // 同样给编译器看,我用泛型指定了,只迭代Animal类型
  39. while (it1.hasNext()) {
  40. // 这里取出的元素只能是Animal了
  41. it1.next().move();
  42. }
  43. }
  44. }
  45. class Animal {
  46. public void move() {
  47. System.out.println("动物在移动!");
  48. }
  49. }
  50. class Dog extends Animal {
  51. public void move() {
  52. System.out.println("狗狗在跑步!");
  53. }
  54. }
  55. class Bird extends Animal {
  56. public void move() {
  57. System.out.println("鸟儿在飞翔!");
  58. }
  59. }

4、jdk8之后,泛型有自动推断类型功能(又被称为:钻石表达式,因为“<>”看起来像钻石)

例如:

  1. List<E> list = new ArrayList<>();

后面<>中可以不用写类型,系统会推断出来是E类型。


5、泛型可以自定义吗?可以。

如何自定义泛型?

测试代码:

  1. public class Test10 {
  2. public static void main(String[] args) {
  3. MyGenericity<String> mg = new MyGenericity<String>(); // 指定为String类型
  4. mg.doSome("hello");
  5. //mg.doSome(1); // 编译报错,类型不匹配
  6. String str = mg.doOther(); // 返回指定类型String
  7. //MyGenericity<int> mg1 = new MyGenericity<int>(); // 注意,只能指定引用类型
  8. MyGenericity<Integer> mg1 = new MyGenericity<Integer>(); // 指定Integer类型
  9. mg1.doSome(10);
  10. //mg1.doSome("hello"); // 编译报错,类型不匹配
  11. Integer i = mg1.doOther(); // 返回指定类型Integer
  12. MyGenericity mg2 = new MyGenericity(); // 这里没有指定类型,默认为Object
  13. mg2.doSome(new Object()); // 这里可以传所有引用类型了
  14. Object obj = mg2.doOther();
  15. }
  16. }
  17. class MyGenericity<Abcd> { // Abcd是标识符,可以随便写,一般写成“E”或者“T”
  18. public void doSome(Abcd a) { // 指定了传Abcd型
  19. System.out.println(a.toString());
  20. }
  21. public Abcd doOther() { // 返回指定类型
  22. return null;
  23. }
  24. }

发表评论

表情:
评论列表 (有 0 条评论,31人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java 定义

    Java泛型编程是JDK1.5版本后引入的! 一.泛型的优点 (1)类型安全 通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全。 (2

    相关 java定义T

      在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。 1.泛型类

    相关 定义java

    自定义泛型 1 当实例化泛型类的对象时,指明泛型类的类型。指明之后,对应的类中所有使用泛型的位置,都变为实例化中指定的泛型的类型 2 如果我们自定义了泛型类,但是在实例化时