我经历了这些话题
但是,我似乎仍然丢失了super关键字:
当我们声明一个这样的集合时:
List<? super Number> list = null;
list.add(new Integer(0));//this compiles
list.add(new Object());//this doesn't compile
Run Code Online (Sandbox Code Playgroud)
不应该是相反的 - 我们有一个列表,其中包含一些父母的对象(未知类型)Number.所以Object应该适合(因为它是父的Number),Integer不应该.出于某种原因,情况正好相反.
只要我们有以下代码
static void test(List<? super Number> param) {
param.add(new Integer(2));
}
public static void main(String[] args) {
ArrayList<String> sList = new ArrayList<String>();
test(sList); //will never compile, however...
}
Run Code Online (Sandbox Code Playgroud)
编译上面的代码是不可能的(我的理智表明这是正确的行为),但基本逻辑可能证明相反:
String is Object, Object is superclass of Number. So String should work.
我知道这很疯狂,但这不是他们不允许<S super T>构造的原因吗?如果是,那么为什么<? super T> …