gpt4 book ai didi

Java工厂使用泛型和Supplier接口(interface),但仍然需要类型转换,有些不对劲

转载 作者:行者123 更新时间:2023-11-30 02:10:22 24 4
gpt4 key购买 nike

我尝试使用泛型和供应商来避免需要对静态工厂方法的结果进行类型转换,但失败了。我想我已经很接近了,有人可以指出我在这里做错了什么吗?

这是参数化接口(interface)IManager:

public interface IManager<C extends IConfigObject> {

这是一个抽象基类AbstractManager,其中包含静态工厂方法:

public abstract class AbstractManager<C extends IConfigObject> implements IManager<C> {
....
public static <C extends IConfigObject> AbstractManager<C> getInstance(Supplier<? extends AbstractManager<C>> supplier) {

接下来,这是一个名为 MyManager 的具体实现,它使用 MyConfigObject 进行参数化,而后者又实现 IConfigObject:

public final class MyManager extends AbstractManager<MyConfigObject> {

最后是 main() 代码:

Supplier<MyManager> supplier = MyManager::new;
MyManager manager = (MyManager) AbstractManager.getInstance(supplier);

如果我没有在那里进行强制转换,我会收到编译器错误:

Type mismatch: cannot convert from AbstractManager to MyManager

有什么建议吗?

最佳答案

您的问题在这里:Supplier<? extends AbstractManager<C>> 。通过使用通配符,您是在说“我不关心实际类型”,但您确实关心。

这里的关键是首先使用两个类型参数,其中第二个依赖于第一个(我使用 M 表示“manager”):

public static <C extends IConfigObject, M extends AbstractManager<C>>
M getInstance(Supplier<M> supplier)
{
// ...
}

如果您不使用C在方法体中,您可以将其重构为:

public static <M extends AbstractManager<? extends IConfigObject>>
M getInstance(Supplier<M> supplier)
{
// ...
}

关于Java工厂使用泛型和Supplier接口(interface),但仍然需要类型转换,有些不对劲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295411/

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