您的位置:首页 > 编程语言 > Java开发

Java泛型之通配符

2015-03-31 22:39 155 查看
概念

Java通配符有两种

1、无限定通配符 形式<?>

2、限定通配符

上边界限定通配符 形式< ? extends Number> //用Number举例

下边界限定通配符 形式< ? super Number> //用Number举例

无限定通配符

使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量的主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

限定通配符

界定通配符的上边界(向上造型一个泛型对象的引用)

Vector<?extends 类型1> x = new Vector<类型2>();

类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的子类

Vector<?extends Number> x = newVector<Integer>();//这是正确的

Vector<?extends Number> x = newVector<String>();//这是错误的

界定通配符的下边界(向下造型一个泛型对象的引用)

Vector<?super 类型1> x = newVector<类型2>();

类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的父类

Vector<?super Integer> x = new Vector<Number>();//这是正确的

Vector<?super Integer> x = new Vector<Byte>();//这是错误的

提示:限定通配符总是包括自己

存取原则和PECS法则

? extends 和 ? super 通配符的特征,我们可以得出以下结论:

◆ 如果你想从一个数据类型里获取数据,使用 ? extends 通配符

◆ 如果你想把对象写入一个数据结构里,使用 ? super 通配符

◆ 如果你既想存,又想取,那就别用通配符。

这就是Maurice Naftalin在他的《Java Generics and Collections》这本书中所说的存取原则,以及Joshua Bloch在他的《Effective Java》这本书中所说的PECS法则。

Bloch提醒说,这PECS是指”Producer Extends, Consumer Super”,这个更容易记忆和运用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: