【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()); //运行类型 }