一、目录
- 泛型的介绍
- 泛型的好处
- 泛型的细节
- 泛型的练习
- 泛型又称参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题。
- 在类声明或实例化时只要指定好需要的具体类型即可。
- Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
- 泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。
泛型的语法:
- 泛型的声明 interface 接口{}和class 类名{} 比如:List、ArrayList…
- 其中,T,K,V不代表值,而是表示类型。
- 任意字母都可以。常用T表示,是Type的缩写。
- 泛型的实例化 要在类名后面指定类型参数的值(类型)。如:
- List strList = new ArrayList();
- Iterator iterator = customers.iterator();
- 不能对加入到集合ArrayList中的数据类型进行约束(不安全的)。
- 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。
- interface List{}, public class HashSet{}…等等,这里的T、E只能是引用类型,不能是基本数据类型。例如Integer可以,但Int就不行。
- 在指定泛型的具体类型后,可以传入该类型或者其子类类型。
- 泛型使用形式:List list = new ArrayList();
- 在实际开发中,往往会采用简写的方式:List list = new ArrayList();编译器会默认里面就是Integer。
- 如果不写泛型,比如List list = new ArrayList(); 默认给它的泛型是Object。
定义Employee类:
- 该类包含:private成员变量name、sal、birthday,其中birthday为MyDate类的对象;
- 为每一个属性定义getter、setter方法;
- 重写toString方法输出name、sal、birthday;
- MyDate类包含:private成员变量month、day、year;并为每一个属性定义getter、setter方法;
- 创建该类的3个对象,并把这些对象放入ArrayList集合中(ArrayList需使用泛型来定义),对集合中的元素进行排序,并遍历输出。
排序方法:调用ArrayList的sort方法,传入Comparator对象(使用泛型),先按照name排序,如果name相同,则按生日日期的先后排序。
package com.javageneric;
import java.util.ArrayList;
import java.util.Comparator;
public class JavaGeneric {
public static void main(String[] args) {
ArrayList employees = new ArrayList();
employees.add(new Employee("Jack", 1000, new MyDate(13, 11, 1992)));
employees.add(new Employee("Tom", 11100, new MyDate(2, 1, 1982)));
employees.add(new Employee("Trump", 100000, new MyDate(19, 3, 1963)));
employees.add(new Employee("Tom", 11100, new MyDate(3, 1, 1982)));
System.out.println(employees);
employees.sort(new Comparator() {
@Override
public int compare(Employee o1, Employee o2) {
if(!((o1 instanceof Employee) && (o2 instanceof Employee))){
System.out.println("The type is incorrect");
return 0;
}
int i = o1.getName().compareTo(o2.getName());
if (i != 0){
return i;
}
int yearMinus = o1.getBirthday().getYear() - o2.getBirthday().getYear();
if(yearMinus != 0){
return yearMinus;
}
int monthMinus = o1.getBirthday().getMonth() - o2.getBirthday().getMonth();
if(monthMinus != 0){
return monthMinus;
}
return o1.getBirthday().getDay() - o2.getBirthday().getDay();
}
});
System.out.println(employees);
}
}
class MyDate{
private int day, month, year;
public MyDate(int day, int month, int year) {
this.day = day;
this.month = month;
this.year = year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "MyDate{" +
"day=" + day +
", month=" + month +
", year=" + year +
'}';
}
}
class Employee{
private String name;
private double sal;
private MyDate birthday;
public Employee(String name, double sal, MyDate birthday) {
this.name = name;
this.sal = sal;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public MyDate getBirthday() {
return birthday;
}
public void setBirthday(MyDate birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "\nEmployee{" +
"name='" + name + '\'' +
", sal=" + sal +
", birthday=" + birthday +
'}';
}
}
output:
[
Employee{name='Jack', sal=1000.0, birthday=MyDate{day=13, month=11, year=1992}},
Employee{name='Tom', sal=11100.0, birthday=MyDate{day=2, month=1, year=1982}},
Employee{name='Trump', sal=100000.0, birthday=MyDate{day=19, month=3, year=1963}},
Employee{name='Tom', sal=11100.0, birthday=MyDate{day=3, month=1, year=1982}}]
[
Employee{name='Jack', sal=1000.0, birthday=MyDate{day=13, month=11, year=1992}},
Employee{name='Tom', sal=11100.0, birthday=MyDate{day=2, month=1, year=1982}},
Employee{name='Tom', sal=11100.0, birthday=MyDate{day=3, month=1, year=1982}},
Employee{name='Trump', sal=100000.0, birthday=MyDate{day=19, month=3, year=1963}}]