【发布时间】:2010-10-02 19:15:04
【问题描述】:
我浏览了这些主题
但是,我似乎仍然对 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>?
有人可以帮我恢复这个逻辑链的缺失部分吗?
【问题讨论】: