相关疑难解决方法(0)

Java泛型:Collections.max()签名和Comparator

我理解集合的get和put原则:如果一个方法接受一个集合,它将写入一个类型T,参数必须是Collection<? super T>,而如果它将读取一个类型T,参数必须是Collection<? extends T>.

但有人可以解释Collections.max()签名:

public static <T> T max(Collection<? extends T> coll,
                    Comparator<? super T> comp)
Run Code Online (Sandbox Code Playgroud)

特别是为什么它Comparator<? super T>而不是Comparator<? extends T>

java generics comparator

25
推荐指数
1
解决办法
4129
查看次数

"ArrayList <A>"和"ArrayList <?extends A>"之间的实际区别是什么?

我看了问题q1,q2,q3,但它们并没有完全涵盖我的问题.

注意,ArrayList<A> and ArrayList<? extends A>它们用于声明变量或参数(不用于创建新的泛型类).

声明对象属性时,两个表达式是否等效(案例1)?:

class Foo {

  private ArrayList<A> aList; // == ArrayList<? extends A> aList;
}
Run Code Online (Sandbox Code Playgroud)

编辑:从允许添加哪种对象的角度来看,两个表达式是否相同aList?,但与下列情况的意义不同?

但在参数声明(案例2)中使用时它们是不同的?:

void methodFoo(ArrayList<A> al)  !=  void methodFoo(ArrayList<? extends A> al)
Run Code Online (Sandbox Code Playgroud)

因为第一个只允许传递ArrayList对象,而第二个就像允许发送的"更宽容" ArrayList<A1>并且ArrayList<A2>(只要A1和A2扩展A)?

如果这是正确的,那么这两个表达式是否有效地存在其他情况?

谢谢,

java generics

5
推荐指数
1
解决办法
906
查看次数

标签 统计

generics ×2

java ×2

comparator ×1