3 回答

TA贡献1874条经验 获得超12个赞
如果要对不同类型的方法参数强制执行某种关系,则不能使用通配符,必须使用类型参数。
src
dest
copy()
public static <T extends Number> void copy(List<T> dest, List<T> src)
dest
src
List
src
dest
.
public static void copy(List<? extends Number> dest, List<? extends Number> src)
List<Integer>
List<Float>
dest
src
src
dest
如果只有一个参数化类型参数,则可以使用通配符,尽管类型参数也会工作。 类型参数支持多个边界,通配符不支持。 通配符支持上下界,类型参数只支持上界。因此,如果您想要定义一个采用 List
类型 Integer
或者是超级班,你可以: public void print(List<? super Integer> list) // OK
但是不能使用类型参数: public <T super Integer> void print(List<T> list) // Won't compile
参考资料:

TA贡献1811条经验 获得超5个赞
public static <T1, T2 extends T1> void merge(SinglyLinkQueue<T1> d, SinglyLinkQueue<T2> s){ // merge s element into d}public static <T> void merge(SinglyLinkQueue<T> d, SinglyLinkQueue<? extends T> s){ // merge s element into d}
“一般规则是在可能时使用通配符,因为通配符代码通常比具有多个类型参数的代码更具可读性。在决定是否需要类型变量时,问问自己该类型变量是否用于关联两个或多个参数,还是将参数类型与返回类型相关联。如果答案是否定的,那么通配符就足够了。”

TA贡献1877条经验 获得超1个赞
public <T> T giveMeMaximum(Collection<T> items);public <T> Collection<T> applyFilter(Collection<T> items);
Long
Long
Collection<Long>
public int count(Collection<?> items);public boolean containsDuplicate(Collection<?> items);
int
boolean
.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c);}
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ...}
List<? extends T> src
interface Fruit{}
class Apple implements Fruit{}class Pear implements Fruit{}class Tomato implements Fruit{}
List<? extends Fruit> basket = new ArrayList<? extends Fruit>();basket.add(new Apple());basket.add(new Pear()); basket.add(new Tomato());List<Fruit> fridge = new ArrayList<Fruit>(); Collections.copy(fridge, basket);// works
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ...}
List<S> src
List<Apple> basket = new ArrayList<Apple>();basket.add(new Apple());basket.add(new Apple());basket.add(new Apple()); List<Fruit> fridge = new ArrayList<Fruit>();Collections.copy(fridge, basket); /* works since the basket is defined as a List of apples and not a list of some fruits. */
添加回答
举报