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

标签 java generics factory

初始情况:

我为其他一些通用接口(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/

相关文章:

dart - 什么时候应该在 dart 中使用 final 字段、工厂构造函数或带有 getter 的私有(private)字段?

java - Linux 64 位 libjvm.so : file format not recognized

java - 加法答案错误

java - Install4J 注册自定义 URI Mac

java - <?扩展类> 和 <? Java 中的 super Class> - 为什么它会这样工作?

c# - 我可以在 XAML(.NET 4 Framework 之前)中指定泛型类型吗?

ruby-on-rails - 你如何覆盖 :set_initial_state from AASM when testing with Factory Girl factories?

java - Spring Boot 提供 m3u8 播放列表

generics - 如何为类型引用的操作指定通用特征?

c++ - 如何指定工厂对象的类型