4

可能重复:
java泛型超级关键字

我无法将我的知识与以下示例程序联系起来。请参阅下面的示例程序,然后我的疑问在该程序下方。

import java.util.*;
class A { }
class B extends A { }
class C extends B { }

public class sampleprog {

    public static void main(String[] args) {

        List<? super A> list1 = new ArrayList<A>();
        list1.add(new A());//valid. ok
        list1.add(new B());//valid, why? it is not super to A?
        list1.add(new C());//valid, why? it is not super to A?

        List<? super B> list2 = new ArrayList<A>();
        list2.add(new A());//not valid. why? it is also super to B!!!
        list2.add(new B());
        list2.add(new C());

        List<? super C> list3 = new ArrayList<C>();
        list3.add(new A());//not valid, why? It is super to A so should be valid!!!
        list3.add(new B());//not valid, why? It is super to A so should be valid!!!
        list3.add(new C());
    }
}

我的疑问: - 据我所知,这? super T意味着您可以添加任何超级类,T但这里的输出不同?甚至子类也成功添加,这完全令人困惑。- 输出与列表初始化 ( List<? super C> list3 = new ArrayList<C>();) 没有区别。在这个初始化中,我分配了Aor的列表B,输出是一样的!

请解开我的疑惑。

4

4 回答 4

1

如果我们? super在泛型声明中使用,引用可以指向相同的泛型集合或超泛型集合。因此,在这种情况下,通过 IS-A 测试的所有内容都是有效的。

于 2013-01-02T03:59:29.187 回答
1

List<? super B>意思是

List<? super B> list1 = new ArrayList<A>();
List<? super B> list1 = new ArrayList<B>();

被允许。ArrayList<A>是超级的ArrayList<B>,不是吗?我们可以将B's 和C' 添加到ArrayList<A>and ArrayList<B> 中吗?我们可以。可以加A's吗?only toArrayList<A>.但是List<? super B>也允许指向ArrayList<B>。所以我们不能将A's 添加到List<? super B>.

于 2013-01-02T05:13:29.793 回答
1

“? super T” 表示您可以添加的任何类必须是 T 或其子类的实例。

因此List<? super C> list3 = new ArrayList<C>();,在 list3 中,您可以添加 C 类或其子类实例 ( SomeClass extends C) 的实例。

父对象列表可以有自己的子对象和子对象,但为子类创建的列表不能有其父对象。希望你现在清楚了。

于 2013-01-02T05:13:38.380 回答
0

投票给@us2012 的评论。

  • 为了List<? super A>

    类型是 A。A、B 和 C 都是 A 的子类型,因此可以添加它们。

  • 为了List<? super B>

    类型可以是A,B。B和C都是A或B的子类型。想想两者的区别List<? super B> list2 = new ArrayList<A/B>()

  • 为了List<? super C>

    类型可以是 A、B、C。所以只有 C 是 A、B 或 C 的子类型。

例如,Machine-> Car-> SportsCar。因为List<? super Machine>,无论是Machine、Car、SportsCar,都是Machine,所以添加是安全的。

于 2013-01-02T04:49:56.700 回答