gpt4 book ai didi

方法签名中的 Java 泛型类型不匹配

转载 作者:行者123 更新时间:2023-11-30 06:22:04 27 4
gpt4 key购买 nike

我有一个 Executor调用接口(interface)实例的类 IService<T>KeyList<T>争论。

   class Executor{
KeyList<?> _keys;
IService<?> _service;
public Executor(IService<?> service, KeyList<?> keys){
_service = service;
_keys = keys;
}

public void execute(){
_service.invoke(_keys);
}
}

interface IService<T>{
public void invoke( KeyList<T> keys);
}

class KeyList<T> {
List<T> _list;
}

我用了<?>对于 Executor 的成员,因为它不关心 IService 和 KeyList 是如何参数化的,但是下面会引发编译错误,指出参数不适用:

 public void execute(){
_service.invoke(_keys); //error on invoke
}

我猜它在提示,因为 KeyList<?>不等于 KeyList<T> ,但是 <?><? extends Object>相同,所以我有点困惑。有更好的选择吗?

最佳答案

A wildcard (?) 表示一些特定的未知类型。但是你在这里处理两个单独的通配符——它们可能不一样。请改用以下内容:

class Executor<T> {
KeyList<T> _keys;
IService<T> _service;
public Executor(IService<T> service, KeyList<T> keys){
_service = service;
_keys = keys;
}

public void execute(){
_service.invoke(_keys);
}
}

这为 Executor 类声明了一个类型参数 T,然后将其用作 _keys_service 的类型参数,确保它们兼容。

如果你不能参数化Executor,尝试使用参数化的辅助类:

class Executor {

private static final class ServiceAndKeys<T> {

private final KeyList<T> keys;
private final IService<T> service;

ServiceAndKeys(IService<T> service, KeyList<T> keys) {
this.service = service;
this.keys = keys;
}

void execute() {
service.invoke(keys);
}
}

private final ServiceAndKeys<?> serviceAndKeys;

public <T> Executor(IService<T> service, KeyList<T> keys){
serviceAndKeys = new ServiceAndKeys<T>(service, keys);
}

public void execute() {
serviceAndKeys.execute();
}
}

关于方法签名中的 Java 泛型类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749005/

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