我理解集合的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>?
注意,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)?
如果这是正确的,那么这两个表达式是否有效地存在其他情况?
谢谢,