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

Til*_*fer 5 java generics factory

初步情况:

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

public interface Factory<T, X extends A<T>> {
  public X create();
}
Run Code Online (Sandbox Code Playgroud)

问题描述:

现在我遇到的问题是我需要为每一种类型T实例化一个工厂.这变得非常不方便,特别是如果一段代码想从做一些改造A<T>A<T2>,其中T2是一些以前未知的类型或有这么多不同的T2,我不想为每个特殊情况指定数百家工厂.

目标:

我想将类型T作为create方法的泛型参数传递.这样我得到的东西(注意,不正确的Java :-)):

public interface Factory<X extends A<?>> {
  public <T> X<T> create();
} 
Run Code Online (Sandbox Code Playgroud)

Factory的实现可能只需执行以下操作:

public class Factory4B implements Factory<B> {
  public <T> X<T> create() {
    return new B<T>();
  }
} 
Run Code Online (Sandbox Code Playgroud)

将以上版本的接口写下来会给出create的返回值的错误消息:

X型不是通用的; 它不能用参数参数化

问题:

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

感谢您抽出时间提前回答这个问题.

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

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

例:

  • 让我们想一下派生自的C类A<String>.
  • C<Integer>由于C没有类型参数,因此无法创建.
  • 因此,不存在可能创建的一般工厂 C<Integer>

Hoo*_*pje 3

不,仅靠泛型是不可能的。由于“类型擦除”,运行时 的类型T不再存在,因此 Java 不知道要调用哪个构造函数。

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

public <T> X<T> create(Class<T> classOfT) {
    T t = classOfT.newInstance();
    return new X<T>(t);
}
Run Code Online (Sandbox Code Playgroud)