泛型类和泛型方法
首先看下Java
的正常的泛型的类和泛型方法的写法:
/**
* 泛型类
*/
class Generic<T> {
private T data;
/**
* 返回值是泛型的普通方法
*/
public T getData() {
return data;
}
/**
* 参数是泛型的普通方法
*/
public void setData(T data) {
this.data = data;
}
/**
* 泛型方法
*/
private <E> E getData(E data) {
return data;
}
}
由上面的例子可以看出:
- 在类的后面加
<T>
就可以是泛型类。 - 只有在方法的返回值前加
<T>
才算泛型方法。 - 泛型类里面的泛型方法的声明完全无关。
通配符
在验证限定符之前我们先创建几个有继承关系的类,来方便测试:
public class Food {
public static class Fruit extends Food{}
public static class Apple extends Fruit{}
}
1. <? extends T>
- 从代码中可以看出类型是
Fruit
,Apple
时都没问题,但是在传入Food
时候编译报错。 - 在
add
的时候也会报错。 - 在
get
的时候没问题,但是只能返回Fruit
类型。
2. <? super T>
从上面的例子可以看出,
- 泛型类型只可以传入
Fruit
以及它的超类。 add()
方法中只可以写入Fruit
以及它的子类,因为可以向上转型。get()
方法只能获取一个object
对象,因为object
是所有类的超类,确定不了是哪个类只能是object
。
总结
<? extends T>
只能设置T
以及它的子类,决定了参数的上限。可以安全访问数据,只能获取T
类型数据。<? super T>
只能设置T
以及它的超类,决定了参数的下限。可以安全写入数据,只能写入T
或者T
的子类。