gpt4 book ai didi

java - 使用返回通用接口(interface) 的工厂的类解析 T 列表,而不仅仅是 T

转载 作者:行者123 更新时间:2023-12-01 20:52:19 25 4
gpt4 key购买 nike

我有以下设置。我有一个AbstractFetcher<T>StringFetcher 实现。然后我有一个返回 AbstractFetcher 的工厂s 基于输入..此处 OneClass正在使用AbstractFactoryFetcher 。在方法doSomething我收到第二行的编译器错误,但第一行没有!换句话说fetchMany()编译正常!发生这种情况的原因是什么?即使使用通用方法提示,如何更改签名以便不需要强制转换?我的最终目标是将 OneClass 与有关返回的具体 getter 的任何信息分离,这样即使 FetcherFactory 发生更改,也可以单独部署/编译它。

public interface AbstractFetcher<T> {
T fetchOne();
List<T> fetchMany();
}

public class StringFetcher implements AbstractFetcher<String> {

@Override
public String fetchOne() {
return "a string"
}

@Override
public List<String> fetchMany() {
List<String> list = new ArrayList<>();
list.add("String 1");
list.add("String 2");
return list;
}
}

public interface AbstractFactoryFetcher {
public AbstractFactoryFetcher make(String type);
}

public class FetcherFactory implements AbstractFactoryFetcher {
public AbstractFetcher make(String type) {
if (type.equals("String")) {
return new StringFetcher();
}
else {
return null;
}
}
}

public class OneClass {
FetcherFactory factory;
public OneClass(FetcherFactory factory) {
this.factory = factory;
}

public void doSomething() {
List<String> list = factory.make("String").fetchMany();
String one = factory.make("String").fetchOne(); //compiler error Required: String, Found: Object
}

}

谢谢!

最佳答案

好吧,仍然有铸件,但在工厂里:

public class FetcherFactory {
public <T> AbstractFetcher<T> make(Class<T> type) {
if (type.equals(String.class)) {
return (AbstractFetcher<T>) new StringFetcher();
}
else {
return null;
}
}
}

然后你可以这样调用:

public void doSomething() {
List<String> list = factory.make(String.class).fetchMany();
String one = factory.make(String.class).fetchOne();
}

关于java - 使用返回通用接口(interface) <T> 的工厂的类解析 T 列表,而不仅仅是 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43029289/

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