概述
- 泛型是一种把
类型在对象被创建,或方法被调用的时候才去明确类型的特殊类型。
- 也被称为参数化类型,把类型当作参数传递。
- 格式 <数据类型> , 该类型只能是引用类型。
泛型的应用
泛型类
- 把泛型定义在类上
- 格式
public class 类名<泛型类型1, ....>
- 注意:泛型必须是引用类型
// 定义泛型类
public class ObjectTool<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
泛型方法
- 把泛型定义在方法上
- 格式:
public <泛型类型> 返回类型 方法名(泛型类型 参数名,。。。)
public <T extends Number> Double sum(T value1, T value2) {
double v = value1.doubleValue() + value2.doubleValue();
return v;
}
泛型接口
- 把泛型定义在接口上
- 格式
public interface 接口名<泛型类型, ...>
public interface GenericInterface<T> {
void show(T value);
}
泛型接口的实现类
- 第一种实现方式,在声明类实现接口时,直接指定接口上泛型的具体类型
public class GenericImpl implements GenericInterface<String> {
@Override
public void show(String value) {
System.out.println("value = " + value);
}
}
- 第二种实现方式,在声明类实现接口不指定具体类型,而是在实例化对象的时候再指定具体类型
- 此时,必须要声明泛型类,将该类的泛型指定给接口上的泛型,作为接口上泛型的具体类型
public class GenericImpl<T> implements GenericInterface<T> {
@Override
public void show(T value) {
System.out.println("value = " + value);
}
}
泛型通配符 <?>
- 使用泛型类或方式时,如果不知道使用什么类型,可以用 ? 表示任意类型,? 表示Object以及任意的Java类
- 泛型使用时如果明确指明类型,类型前后指定必须一致
// 正确
Collection<Object> c1 = new ArrayList<Object>();
// 编译报错
Collection<Object> c2 = new ArrayList<Animal>();
? 号类型才是表示泛型的任意类型
// 编译正确
Collection<?> c2 = new ArrayList<Animal>();
- ? extends E : 向下限定,E类型及其子类类型
// 编译正确
Collection<? extends Animal> c2 = new ArrayList<Animal>();
Collection<? extends Animal> c3 = new ArrayList<Dog>();`
- ? super E : 向上限定,E及其父类
// 编译正确
Collection<? super Dog> c2 = new ArrayList<Animal>();
Collection<? super Dog> c3 = new ArrayList<Dog>();`
泛型擦除