* 泛型 : 解决类型安全问题. 在集合中用的多
* 集合中使用了泛型 : 添加时只能添加指定类型的对象, 获取时直接获取指定类型的对象.
* 自定义泛型类, 在类名<泛型类型参数>
代码示例一:
class Person<X> { // X代表了某种类型, 是什么具体的类型不知道. 既然是类型, 就可以用于声明变量或表达方法的返回值.
// X会在这个类的使用时进一步具体化. X类型是隶属于对象的非静态成员.
private String name;
private X info; // info属性的类型就是泛型化的X类型, 会由使用者来决定具体的类型.
public Person() {}
public Person(String name, X info) {
this.name = name;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public X getInfo() {
return info;
}
public void setInfo(X info) {
this.info = info;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", info=" + info +
'}';
}
/* 在静态方法或属性中不可以使用泛型类型, 因为它隶属于对象
public static void test(X x) {
}*/
}
泛型和继承的关系
class Base<W> {
protected W field;
public W getField() {
return field;
}
}
class Sub1 extends Base {} // 子类继承有泛型的父类时, 直接忽略, 会导致父类中的泛型类型只能是Object类型
class Sub2 extends Base<String> {} // 子类在继承泛型父类时, 直接写死, 子类继承的泛型类型永远不变
class Sub3 extends Base<Boolean> {} // 这样的写法使用最多. 因为对于使用者最简单.
class Sub4<P> extends Base<P> {} // 最灵活的写法, 父类中的泛型在子类继续泛型, 这样的写法最灵活
在方法声明中使用泛型
// 泛型方法. 在方法声明中使用泛型.
class GenericMethod {
// 在方法的返回值类型左面加上<泛型类型参数>, 泛型方法必须要使用泛型类型 作为参数的.
// 是一个局部泛型, Q类型和方法的某次调用相关.
public static <Q> Q get(Q q) {
return null;
}
public <Y> Y get2(Y y) {
return null;
}
/*
public static void test2(Q q) {
}*/
}
泛型练习
写一个方法double max(List list)
在测试方法中创建两个List,一个是泛型是整数的,
放一些随机整数, 另一个泛型是Double型, 放一些随机数, 通过方法获取这两个集合的最大值
? extends T :用于查询元素,参数可以是T类型及其未知子类
? super T : 用于插入元素,参数可以是T类型及其未知父类
private double getMax(List<? extends Number> list){ //用于查询元素,参数可以是Number及其未知子类
Number maxNumber = list.get(0);
for (int i = 0; i < list.size(); i++) {
if(maxNumber.doubleValue() <list.get(i).doubleValue()){
maxNumber = list.get(i);
}
}
return maxNumber.doubleValue();
}
纯虚方法调用版本:
//list集合的元素必须是可以比较的对象
private Comparable getMin(List<? extends Comparable> list){
Iterator<? extends Comparable> iterator = list.iterator();
Comparable min = iterator.next();
while(iterator.hasNext()){
Comparable next = iterator.next();
if(next.compareTo(min) < 0){
min = next;
}
}
return min;
}