首先我们来了解一下什么是泛型,泛型的作用又是什么。
泛型的形式是
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;
}
@Override
public 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;
}
@Override
public 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"})
@Override
public 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;
}
@Override
public 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;
}
@Override
public String toString() {
return "MyData{" +
"year=" + year +
", monuth=" + monuth +
", day=" + day +
'}';
}
}
泛型的相关内容我们就聊到这里。