首先我们来了解一下什么是泛型,泛型的作用又是什么。
泛型的形式是
ArrayList<Object> objects = new ArrayList<>();
这里的<Object>这个就是泛型,添加泛型的作用又是什么呢,它可以限制添加对象的类型,比如AarryLsit<Object>则ArrayList只能存放Object类型的元素,这个好处是什么,当我们设置泛型时可以避免一些传入对象类型不对的情况,接下来我们示范一些实际案例:
要求ArraryList当中的元素必须是Person
首先我们来看一下没有有定义泛型的情况:
import java.util.ArrayList;public class Array {@SuppressWarnings({"all"})public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add(new Preson("jack", 18));arrayList.add(new Preson("monkey", 18));arrayList.add(new Cat("mack", 23));System.out.println(arrayList);}
}class Preson{public String name;public int age;public Preson(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Preson{" +"name='" + name + '\'' +", age=" + age +'}';}
}class Cat{public String name;public int age;public Cat(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
我们发现添加Cat类型的对象也是可以添加上去的,这里就不符合我们添加对象的限制,当我们
添加一下泛型时看一下是否能限制不符合要求对象的加入。
这里我们发现当我们添加泛型之后我们发现当我们想添加Cat类型的对象的时候我们发现该语句报错了,这就是泛型的作用。
泛型的作用也不止于此,它还可以应用在方法当中,即泛型方法:
class Person<E> {
public Person(E s) {//E 也可以是参数类型
this.s = s;
}
}
这里就是我们的泛型类和泛型构造器,E是通过你传入的对象类型自动进行替换如果传入的是String类型则这个E就是String类型,依次类推;
public E f() {// 返回类型使用 E
return s;
}
public class Array {@SuppressWarnings({"all"})public static void main(String[] args) {Dog1<String> wc = new Dog1<>("旺财");System.out.println(wc.f());}
}
class Dog1<E>{public E s;public Dog1(E s) {this.s = s;}public E f(){return s;}
}
这里我们发现E类型就变成了String类型。
当我们没有定义泛型时默认E为Object类型,而且泛型最好不要与静态属性定义在一块,因为二者是冲突的,没有确定E类型的时候是无法进行初始化的,泛型的定义不是一定要用E来表示也可以是其他的比如T,S,P等等,泛型的定义必须是引用类型,基本数据类型无法定义泛型。
泛型可以定义多个比如:
class Tiger<S, T, M>{
String name;
String name;
S s;
T t;
M m;
}
泛型的使用范围很广,可以定义属性,返回类型,数组(泛型定义的数组,不能进行初始化,因为类型不确定,所以无法开辟空间),接口等等,泛型一旦被定义一个固定的引用类型,即可传入本类或者其子类的类型。
接下来我们看一个泛型的实例演示:
题目要求:
代码展示:
import java.util.ArrayList;
import java.util.Comparator;public class inclass {public static void main(String[] args) {@SuppressWarnings({"all"})ArrayList<Employees> employees = new ArrayList<>();employees.add(new Employees("zzh", 50000, new MyData(2003, 9, 21)));employees.add(new Employees("hsx", 30000, new MyData(2002, 10, 11)));employees.add(new Employees("ksx", 30000, new MyData(2002, 10, 11)));System.out.println(employees);System.out.println("=====排序后的结果");employees.sort(new Comparator<Employees>() {@SuppressWarnings({"all"})@Overridepublic int compare(Employees emp1, Employees emp2) {if (!(emp1 instanceof Employees && emp2 instanceof Employees)) {return 0;}//是否为Employees类或者子类如果不是则返回0退出比较int i = emp1.getName().compareTo(emp2.getName());if (i != 0){return i;}//比较姓名的字符大小int year = emp1.getMydata().getYear() - emp2.getMydata().getYear();if (year != 0){return year;}//在姓名相同的情况下比较年份大小int monuth = emp1.getMydata().getMonuth() - emp2.getMydata().getMonuth();if (monuth != 0){return monuth;}//在前两者都相同的情况下比较月份大小return emp1.getMydata().getDay() - emp2.getMydata().getDay();//前三者都相同的话再进行天数的判断}});System.out.println(employees);}
}class Employees{private String name;private int dale;private MyData mydata;public Employees(String name, int dale, MyData mydata) {this.name = name;this.dale = dale;this.mydata = mydata;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getDale() {return dale;}public void setDale(int dale) {this.dale = dale;}public MyData getMydata() {return mydata;}public void setMydata(MyData mydata) {this.mydata = mydata;}@Overridepublic String toString() {return "Employees{" +"name='" + name + '\'' +", dale=" + dale +", mydata=" + mydata +'}';}
}class MyData{private int year;private int monuth;private int day;public MyData(int year, int monuth, int day) {this.day = day;this.monuth = monuth;this.year = year;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}public int getMonuth() {return monuth;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public void setMonuth(int monuth) {this.monuth = monuth;}@Overridepublic String toString() {return "MyData{" +"year=" + year +", monuth=" + monuth +", day=" + day +'}';}
}
泛型的相关内容我们就聊到这里。