0

我目前面临基类和子类的问题。

虽然将单个对象作为参数(方法单一),但编译器不会抱怨。

但是,如果涉及到列表,编译器会强制我将列表声明为<? extends Base>

之后,我不再被允许将基本类型的对象添加到该列表中。

如何在一个列表中同时使用两种类型(基类和子类)?

public class Generics {

    class Base {    }

    class Sub extends Base{     }

    interface I {
        public void list( List<Sub> list );
        public void single( Sub p);
    }

    class C implements I {
        public void list( List<Sub> list) {     }
        public void single( Sub p) {        }
    }

    void test() {
        C c = new C();
        c.single( new Sub() );
        c.list( new ArrayList<Base>() ); // The method list(List<Generics.Sub>) in the type Generics.C is not applicable for the arguments (ArrayList<Generics.Base>)

    }

    public static void main( String[] args) {
        Generics g = new Generics();
        g.test();
    }
}
4

3 回答 3

1

改变:

public void list(List<Sub> list);

至:

public void list(List<? extends Base> list);

使用 justList<Base>会给你这样的编译器错误:

public static void main(String[] args) {
    List<Sub> subs = new ArrayList<Sub>();
    doSomethingWith(subs); // The method doSomethingWith(List<Base>) in the type Main is not applicable for the arguments (List<Sub>)
}

private static void doSomethingWith(List<Base> bases) {
    // Do something with bases
}

如果您要传递的只是List<Base>to doSomethingWith,那么这一点没有实际意义,因为这不会给您带来编译器错误。如果要传递特定类型的列表(例如List<Sub>上面),则需要更改doSomethingWith为:

private static void doSomethingWith(List<? extends Base> bases) {

这解决了问题。您也可以在调用者控制杆上执行此操作(但有点混乱):

    List<Sub> subs = new ArrayList<Sub>();
    doSomethingWith(new ArrayList<Base>(subs));

通配符 ( ) 方法的一个问题?是您无法将新项目添加到列表中。为此,您需要以下内容:

private static <B extends Base> void doSomethingWith(List<B> bases) {

然后仅将B实例添加到bases.

于 2012-09-24T16:15:24.003 回答
1

只需将所有列表声明为

List<Base> list;

然后您可以添加Base任何子类的对象和对象。

于 2012-09-24T16:01:23.823 回答
1

以下是2种方法来做到这一点......

public void inTake(List<? extends Base> list){

}

或者

public T extends Base void inTake(List<T> list){

}
于 2012-09-24T16:24:41.063 回答