> 文档中心 > 【Java】泛型说明,应用实例,使用细节,自定义泛型

【Java】泛型说明,应用实例,使用细节,自定义泛型

目录

  • 1.泛型引入
  • 2.泛型解释说明
  • 3.泛型细节

1.泛型引入

//使用传统的方法来解决===> 使用泛型

    //1. 当我们 ArrayList 表示存放到 ArrayList 集合中的元素是Dog类型 (细节后面说...)    //2. 如果编译器发现添加的类型,不满足要求,就会报错    //3. 在遍历的时候,可以直接取出 Dog 类型而不是 Object    //4. public class ArrayList {} E称为泛型,那么 Dog->E

普通代码

import java.util.ArrayList;/** * @author Demo龙 * @version 1.0 */@SuppressWarnings({"all"})public class Generic01 {    public static void main(String[] args) { //使用传统的方法来解决 ArrayList arrayList = new ArrayList(); arrayList.add(new Dog("旺财", 10)); arrayList.add(new Dog("发财", 1)); arrayList.add(new Dog("小黄", 5)); //假如我们的程序员,不小心,添加了一只猫 arrayList.add(new Cat("招财猫", 8)); //遍历 for (Object o : arrayList) {     //向下转型Object ->Dog     Dog dog = (Dog) o;     System.out.println(dog.getName() + "-" + dog.getAge()); }    }}/*请编写程序,在ArrayList 中,添加3个Dog对象Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx()) */class Dog {    private String name;    private int age;    public Dog(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;    }}class Cat { //Cat类    private String name;    private int age;    public Cat(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;    }}

泛型改进

import java.util.ArrayList;/** * @author Demo龙 * @version 1.0 */@SuppressWarnings({"all"})public class Generic02 {    public static void main(String[] args) { //使用传统的方法来解决===> 使用泛型 //1. 当我们 ArrayList 表示存放到 ArrayList 集合中的元素是Dog类型 (细节后面说...) //2. 如果编译器发现添加的类型,不满足要求,就会报错 //3. 在遍历的时候,可以直接取出 Dog 类型而不是 Object //4. public class ArrayList {} E称为泛型,那么 Dog->E ArrayList<Dog> arrayList = new ArrayList<Dog>(); arrayList.add(new Dog("旺财", 10)); arrayList.add(new Dog("发财", 1)); arrayList.add(new Dog("小黄", 5)); //假如我们的程序员,不小心,添加了一只猫 //arrayList.add(new Cat("招财猫", 8)); System.out.println("===使用泛型===="); for (Dog dog : arrayList) {     System.out.println(dog.getName() + "-" + dog.getAge()); }    }}/*1.请编写程序,在ArrayList 中,添加3个Dog对象2.Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx())3.老师使用泛型来完成代码 */class Dog {    private String name;    private int age;    public Dog(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;    }}class Cat { //Cat类    private String name;    private int age;    public Cat(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;    }}

2.泛型解释说明

E具体的数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型
E表示 s的数据类型, 该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型

import java.util.List;/** * @author Demo龙 * @version 1.0 */public class Generic03 {    public static void main(String[] args) { //注意,特别强调: E具体的数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型 Person<String> person = new Person<String>("噼噼啪啪"); person.show(); //String /*     你可以这样理解,上面的Person类     class Person {  String s ;//E表示 s的数据类型, 该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型  public Person(String s) {//E也可以是参数类型      this.s = s;  }  public String f() {//返回类型使用E      return s;  }     }  */ Person<Integer> person2 = new Person<Integer>(100); person2.show();//Integer /*     class Person {  Integer s ;//E表示 s的数据类型, 该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型  public Person(Integer s) {//E也可以是参数类型      this.s = s;  }  public Integer f() {//返回类型使用E      return s;  }     }  */    }}//泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,// 或者是某个方法的返回值的类型,或者是参数类型class Person<E> {    E s ;//E表示 s的数据类型, 该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型    public Person(E s) {//E也可以是参数类型 this.s = s;    }    public E f() {//返回类型使用E return s;    }    public void show() { System.out.println(s.getClass());//显示s的运行类型    }}

3.泛型细节

1.给泛型指向数据类型是,要求是引用类型,不能是基本数据类型
2. 说明
因为 E 指定了 A 类型, 构造器传入了 new A()
在给泛型指定具体类型后,可以传入该类型或者其子类类型
3. 泛型的使用形式
在实际开发中,我们往往简写
编译器会进行类型推断, 推荐使用下面写法
ArrayList list3 = new ArrayList();
List list4 = new ArrayList();
ArrayList pigs = new ArrayList();.
4. 如果是这样写 泛型默认是 Object
ArrayList arrayList = new ArrayList();//等价 ArrayList arrayList = new ArrayList();

package com.hspedu.generic;import java.util.ArrayList;import java.util.List;/** * @author Demo龙 * @version 1.0 */@SuppressWarnings({"all"})public class GenericDetail {    public static void main(String[] args) { //1.给泛型指向数据类型是,要求是引用类型,不能是基本数据类型 List<Integer> list = new ArrayList<Integer>(); //OK //List list2 = new ArrayList();//错误 //2. 说明 //因为 E 指定了 A 类型, 构造器传入了 new A() //在给泛型指定具体类型后,可以传入该类型或者其子类类型 Pig<A> aPig = new Pig<A>(new A()); aPig.f(); Pig<A> aPig2 = new Pig<A>(new B()); aPig2.f(); //3. 泛型的使用形式 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<>(); //4. 如果是这样写 泛型默认是 Object ArrayList arrayList = new ArrayList();//等价 ArrayList arrayList = new ArrayList(); /*     public boolean add(Object e) {  ensureCapacityInternal(size + 1);  // Increments modCount!!  elementData[size++] = e;  return true;     }  */ Tiger tiger = new Tiger(); /*     class Tiger {//类  Object e;  public Tiger() {}  public Tiger(Object e) {      this.e = e;  }     }  */    }}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()); //运行类型    }

MSDN工具下载