gpt4 book ai didi

Java 泛型和未经检查的强制转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:17 27 4
gpt4 key购买 nike

我正在努力解决 Java 中泛型的这一方面。希望有人能帮我看看方法。

我有一个包含对象列表的类。这段代码有效,但我想摆脱类型转换。我怎样才能使它更通用?

public class Executor {
List<BaseRequest<BaseObj>> mRequests = new ArrayList<BaseRequest<BaseObj>>();

public Executor() {
}

@SuppressWarnings("unchecked")
public <T extends BaseObj> void add(final BaseRequest<T> request) {
mRequests.add((BaseRequest<BaseObj>) request);
}

public void execute() {
for (BaseRequest<BaseObj> r : mRequests) {
// DO SOMETHING WITH r
}
}
}

最佳答案

在发布的代码片段中,您需要类型转换,因为 BaseRequest<? extends BaseObj>不是 BaseRequest<BaseObj> 的子类型,并且由于类型删除,无法在运行时检查强制转换,这就是编译器警告您的原因。但是如果你改变 mRequests 的声明:

public class Executor  {

List<BaseRequest<? extends BaseObj>> mRequests = new ArrayList<>();

public Executor() {
}

public <T extends BaseObj> void add(final BaseRequest<T> request) {
mRequests.add(request);
}

public void execute() {
for (BaseRequest<? extends BaseObj> r : mRequests) {
// DO SOMETHING WITH r
}
}
}

class BaseRequest<T> {}

class BaseObj {}

让我们逐步解决这个问题。你希望能够调用

req.add(new BaseRequest<ExtObj1>());
req.add(new BaseRequest<ExtObj2>());
req.add(new BaseRequest<ExtObj3>());

哪里ExtObj[1|2|3] extends BaseObj .给定 List 接口(interface):

List<T> {
void add(T el);
}

我们需要为 BaseRequest<ExtObj1> 找到一个共同的父类(super class)型, BaseRequest<ExtObj2>BaseRequest<ExtObj3> .一个父类(super class)型是 BaseRequest<?>另一个是 BaseRequest<? extends BaseObj> .我选择了第二个,因为它是最严格的。你应该知道在 Java 中 BaseRequest<ExtObj1>不是 BaseRequest<BaseObj> 的子类型因为泛型是不变的。

现在我们有了 mRequests 的正确声明,找到了 Executor.add() 的 API很简单。顺便说一句,如果你需要的方法体真的那么简单,你甚至不需要类型参数:

public void add(BaseRequest<? extends BaseObj> request) {
mRequests.add(request);
}

关于Java 泛型和未经检查的强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20661660/

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