gpt4 book ai didi

Java:具有泛型类的方法类型参数的工厂

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

初始情况:

我为其他一些通用接口(interface)创建了一个工厂接口(interface) A<T> :

public interface Factory<T, X extends A<T>> {
public X create();
}

问题描述:

现在我遇到了一个问题,我需要为每个类型 T 实例化一个工厂。这变得非常不方便,特别是如果某些代码想要从 A<T> 进行一些转换时。至 A<T2> ,其中 T2 是一些以前未知的类型,或者有太多不同的 T2,我不想为每个特殊情况指定数百个工厂。

目标:

我想将类型 T 作为创建方法的通用参数传递。这样我得到类似的东西(注意,不正确的 Java :-)):

public interface Factory<X extends A<?>> {
public <T> X<T> create();
}

Factory 的实现可能会简单地做如下事情:

public class Factory4B implements Factory<B> {
public <T> X<T> create() {
return new B<T>();
}
}

把上面版本的接口(interface)写下来给出create返回值的错误信息:

The type X is not generic; it cannot be parameterized with argument

问题:

有什么方法可以实现这样一个通用工厂,还是我需要使用完全不同的方法?我希望能够在类级别指定 X,这样我就可以轻松地实例化 X。我不想为每个参数 T

创建一个工厂

感谢您抽空提前回答这个问题。

根据以下评论重新思考问题 (27.4.15)

根据下面的评论重新思考问题,我的问题无法实现,因为无法保证 A<T> 的子类中仍然存在通用参数。 ,或者换句话说:没有泛型参数的继承。

示例:

  • 让我们想想派生自A<String> 的类C .
  • 不可能创建C<Integer>因为 C 没有类型参数。
  • 因此,不存在可能创建C<Integer> 的通用工厂。

最佳答案

不,仅靠泛型是不可能的。由于“类型删除” T 的类型在运行时不再存在,所以 Java 不知道要调用什么构造函数。

你必须找到一种方法来传递 T 的类型在运行时到你的类(class)。在 Java 中,您可以使用类 Class<S>作为运行时类型 token 。那么你的代码可能看起来像这样:

public <T> X<T> create(Class<T> classOfT) {
T t = classOfT.newInstance();
return new X<T>(t);
}

关于Java:具有泛型类的方法类型参数的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29853104/

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