gpt4 book ai didi

Java8 Supplier 接口(interface)提供正确的类型化实例

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

我如何使用 Java8 Supplier 接口(interface)重写此工厂方法以提供正确的类型化实例?

我有一个扩展 Map 的简单接口(interface):

public interface Thingy<K, V> extends Map<K, V> {}

然后我有一个 ThingyFactory 类,其中包含 Thingy 所有实现类名的列表:

public final class ThingyFactory {
Map<String, Class<Thingy<?, ?>>> thingyclasses = new ConcurrentHashMap<>();
.....

@SuppressWarnings("unchecked")
public <K, V> Thingy<K, V> getInstance(String classname) throws ThingyException {
Thingy<K, V> thingy;
try {
thingy = (Thingy<K, V>) thingyclasses.get(classname).newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new ThingyException("Something bad happened: ", e.toString());
}
return thingy;
}
}

我很确定我可以使用 Supplier 接口(interface)优雅地执行此操作并且不使用 SuppressWarnings 和类加载器,但我似乎无法完全正确地获得模式。任何指导表示赞赏!

最佳答案

因为您使用通配符作为 Thingy 的通用类型在 thingyclasses 内,您实际上是在说:Thingy 的类型可以是任何东西;但是,这会禁止编译器推断有关类型的任何信息,因此您需要显式强制转换。您可以使用 Supplier稍微改进一下,但您仍然会收到有关未经检查的类型转换的警告:

class ThingyFactory {
private Map<String, Supplier<Thingy<?, ?>>> providers = new ConcurrentHashMap<>();

@SuppressWarnings("unchecked")
public <K, V> Supplier<Thingy<K, V>> getInstance(String classname) {
return () -> (Thingy<K, V>) providers.get(classname);
}
}

如果您希望它是类型安全的,则需要完全重新设计它并且仅在编译器能够推断类型时才使用通配符。

关于Java8 Supplier 接口(interface)提供正确的类型化实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50126422/

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