gpt4 book ai didi

Java 使用泛型

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:24 25 4
gpt4 key购买 nike

我有一个这样的接口(interface) A:

public interface A{
void myFirstMethod();
void mySecondMethod();
}

然后我有这门课:

public class MyClass{
private List<? extends A> elements;

public MyClass(){
A obj = new A(){
@Override
public void myFirstMethod(){
//SOME CODE
}
@Override
public void mySecondMethod(){
//SOME CODE
}
};
elements.add(obj);
}
}

我之前没有使用过泛型(只有像 List<String>... 这样的东西)所以我不明白为什么这段代码不能编译。更准确地说,我在 elements.add(obj); 行出错add 方法不适用于这些参数。

编辑:我更改了代码,现在 elements.add(obj) 可以正常编译,但我还有另一个问题。

public class MyClass{
private List<A> elements;

public MyClass(List<A> elements){
this.elements = elements;
elements.add(obj);
}
}

当我尝试这样做时,它无法编译。

//A1 implements A
List<A1> list = new ArrayList<A1>();
MyClass(list);

我该如何解决这个问题?

最佳答案

假设您有两个子类:

class A1 implements A {...}
class A2 implements A {...}

然后你可以写:

List<? extends A> elements = new ArrayList<A1>(); // a list of A1

但是这不应该编译:

elements.add(new A2()); //oops: an A2 is not an A1

因此,您只能添加 null 以外的任何内容到 List<? extends A>因为你不知道它是什么实际的通用类型。换句话说,? extends A表示 A 的特定但未知的子类型(或 A 本身)。

在你的例子中,一个 List<A>可能会做你期望的 - 你可以添加一些 A1 s 和一些 A2就这样吧。

关于Java 使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150580/

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