gpt4 book ai didi

java - 如何在无需转换的情况下获得实现通用接口(interface)的特定类的工厂?

转载 作者:行者123 更新时间:2023-11-30 07:22:54 25 4
gpt4 key购买 nike

所以我得到了一个接口(interface) SuperType 和一堆实现类 TypeA, TypeB 等等。我还得到了一个具有参数化方法的顶级接口(interface):

public interface UsedByProductThing<T extends SuperType> {
public T doStuff(T one);
}

我有一个工厂(见下文)生产实现 GeneralProduct 的对象:

public interface GeneralProduct<T extends SuperType> {
T doSomething(T input);
}

下面是 ProductA 的实现:

public class ProductA implements GeneralProduct<TypeA> {
UsedByProductThing<TypeA> in;

public ProductA(UsedByProductThing<TypeA> in) {
this.in = in;
in.doStuff(new TypeA());
}

@Override
public TypeA doSomething(TypeA input) {
return null;
}
}

现在有问题的工厂:

public class GeneralFactory {
public static <T extends SuperType> GeneralProduct<T> createProduct(
int type, UsedByProductThing<T> in) {
switch (type) {
case 1:
return (GeneralProduct<T>) new ProductA((UsedByProductThing<TypeA>) in);
// at this point, i want to return a "new ProductA(in)" preferably
// without casting
// or at least without the cast of the argument.
default:
throw new IllegalArgumentException("type unkown.");
}
}
}

如评论所述,我希望该工厂方法不使用强制转换。我知道返回类型必须是 GeneralProduct,但我想不出省略强制转换的方法(它也给了我一个“未经检查的强制转换”警告)。另外,我想不出省略参数转换的方法。如果有必要摆脱那个地方的“不安全”转换,我可以重组整个代码。你能告诉我一个在这里会很好很顺利的方法吗?

此外,请根据需要编辑我的问题 - 我不知道如何在标题中正确解决问题。

非常感谢!

最佳答案

你无法避免转换,因为

  • 你有in其类型为 UsedByProductThing<T>你想把它变成 UsedByProductThing<TypeA>并且编译器无法知道 TTypeA
  • 产品 A 是 GeneralProduct<TypeA>编译器再次不知道 TTypeA在这里。

避免转换的唯一方法是替换 TTypeA

    public static GeneralProduct<TypeA> createProduct(
int type, UsedByProductThing<TypeA> in) {
switch (type) {
case 1:
return new ProductA(in);
default:
throw new IllegalArgumentException("type unkown.");
}
}

关于java - 如何在无需转换的情况下获得实现通用接口(interface)的特定类的工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424533/

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