泛型类和泛型方法
首先看下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的子类。
本文详细介绍了Java中泛型类和泛型方法的概念,并重点讲解了通配符`<? extends T>`和`<? super T>`的用法。`<? extends T>`限制了参数为T或其子类,适用于读取操作;`<? super T>`则限制为T或其超类,适合写入操作。通过实例展示了它们在继承关系中的行为差异,帮助开发者更好地理解和运用Java泛型。
1677

被折叠的 条评论
为什么被折叠?



