我经历了这些话题
但是,我似乎仍然对super
关键字感到迷茫:
当我们声明这样的集合时:
List<? super Number> list = null; list.add(new Integer(0)); // this compiles list.add(new Object()); // this doesn't compile
不应该相反吗?我们有一个列表,其中包含一些对象(类型未知),它们是的父对象Number
。因此Object
应该适合(因为它是的父项Number
),Integer
而不应该。由于某种原因,情况恰恰相反。
只要我们有以下代码
static void test(List<? super Number> param) { param.add(new Integer(2)); } public static void main(String[] args) { List<String> sList = new ArrayList<String>(); test(sList); // will never compile, however... }
编译上面的代码是不可能的(我的理智建议这是正确的行为),但是基本逻辑可以证明是相反的:
String is Object, Object is superclass of Number. So String should work.
我知道这很疯狂,但这不是他们不允许使用<S super T>
结构的原因吗?如果是,那为什么<? super T>
允许?
有人可以帮助我恢复此逻辑链的缺失部分吗?