原文地址:http://www.c2.com/cgi/wiki?BoundedWildcardsIncreaseApplicability
批注:也是相当熟悉,在Effects Java 第二版上见过
一种Java风格在方法参数上使用泛型,当方法参数为"producer"时使用通配符界限"extends"(参数只被读取),当方法参数为"consumer"时使用'super' 通配符(将会修改参数值),你可以使用口诀进行记忆 PECS (Producer Extends, Consumer Super).
由JoshuaBloch at JavaOne: [url]http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1512.pdf [/url]
一个JagGregate上的例子
批注:代码本身只是用于了解下具体意图
如果这个集合的方法没有使用通配符,那么 digits.addAll() 只能运行Number泛型的集合参数,即使它可以使用Integers, Doubles, 等. 类似的digits.select()只能允许判断使用Number的泛型, 即使他允许以Number为泛型超类的对象.
...翻译并不精准,例子也不如Effects Java的好理解,有时间拿过来补充一下.
批注:也是相当熟悉,在Effects Java 第二版上见过
一种Java风格在方法参数上使用泛型,当方法参数为"producer"时使用通配符界限"extends"(参数只被读取),当方法参数为"consumer"时使用'super' 通配符(将会修改参数值),你可以使用口诀进行记忆 PECS (Producer Extends, Consumer Super).
由JoshuaBloch at JavaOne: [url]http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1512.pdf [/url]
一个JagGregate上的例子
abstract class UnaryPredicate<A> {
boolean matches( A target );
}
interface Collection<E> {
boolean addAll( Collection<? extends E> newElements );
Collection<E> select( UnaryPredicate<? super E> discriminator );
}
UnaryPredicate<Object> evenHash = new UnaryPredicate<Object>() {
public boolean matches( Object target ) {
return target == null || target.hashCode() % 2 == 0;
}
};
Collection<Number> digits = Set.emptySet();
digits.addAll( Interval.fromTo( 0, 9 ) );
Collection<Number> digitsWithEvenHash = digits.select( evenHash );
批注:代码本身只是用于了解下具体意图
如果这个集合的方法没有使用通配符,那么 digits.addAll() 只能运行Number泛型的集合参数,即使它可以使用Integers, Doubles, 等. 类似的digits.select()只能允许判断使用Number的泛型, 即使他允许以Number为泛型超类的对象.
...翻译并不精准,例子也不如Effects Java的好理解,有时间拿过来补充一下.