gpt4 book ai didi

java - 如何在一个列表中包含基类和子类的实例?

转载 作者:行者123 更新时间:2023-12-02 00:12:11 25 4
gpt4 key购买 nike

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

虽然有一个对象作为参数(单个方法),但编译器不会提示。

但是如果涉及到列表,编译器会强制我将列表声明为 <? 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();
}
}

最佳答案

更改:

public void list(List<Sub> list);

至:

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

仅使用List<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>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 .

关于java - 如何在一个列表中包含基类和子类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com