1

我一直在用 Java 测试超类型泛型,但遇到了障碍。这是我正在测试的示例代码:

import java.util.*;

class GenericTests {
    public static void main( String[] args ) {      
        List<B> list3 = new ArrayList<B>();
        testMethod( list3 );
    }

    public static void testMethod( List<? super B> list ) {
        list.add( new A() );
        list.add( new B() );
    }
}

class A { }

class B extends A { }

编译时,错误是:

GenericTests.java:20: error: no suitable method found for add(A)
            list.add( new A() );
                ^
method List.add(int,CAP#1) is not applicable
  (actual and formal argument lists differ in length)
method List.add(CAP#1) is not applicable
  (actual argument A cannot be converted to CAP#1 by method invocation conve
rsion)
where CAP#1 is a fresh type-variable:
CAP#1 extends Object super: B from capture of ? super B
1 error

我认为给定 B 的下限,您可以添加任何超类型?或者这是否仅适用于引用(即方法签名中的参数),因为允许超类型会破坏类型检查?

4

2 回答 2

3

声明List<? super B> list说这listListB 继承的某种类型的对象。但是这种类型不需要与A. 假设层次结构是:

public class A {...}

public class C extends A {...}

public class B extends C {...}

那么,list可能是一个List<C>. 但随后list.add(new A())是非法的。的实例A不是 的实例C。编译器只知道可以将实例B或子类添加到list.

于 2013-05-21T03:15:11.397 回答
0

你得到的想法与? super B实际不同。这里super的操作如下所示:

public static void main( String[] args ) {      
    List<B> list3 = new ArrayList<B>();
    testMethod( list3 );

    List<A> listA = new ArrayList<>();
    testMethod(listA); --> U can pass a list of A
}

public static void testMethod( List<? super B> list ) {
    list.add( new B() );
}

这个答案详细讨论了这个事实。

于 2013-05-21T03:21:26.533 回答