1

所以说我有:

public class Foo<T> {
  // Some stuff
}

public interface Factory<T> {
  T newInstance();
  Class<T> getKlass();
}

我想实现 Factory 来构建 Foo<T>s:

public class FooFactory<T> implements Factor<Foo<T>> {
  private Class<Foo<T>> klass;
  public FooFactory(Class<Foo<T>> klass) {
    this.klass = klass;
  }

  public T newInstance() throws Exception {
    return klass.newInstance();
  }

  public Class<Foo<T>> getKlass() {
    return klass;
  }
}

两个问题:

  1. 如果我只有 Class<T>,有什么方法可以让我获得 Class<Foo<T>>?不幸的是,Foo 是一个私有类,因此唯一具有全貌(即知道 T 将是什么)的代码不知道 Foo,因此不能给我 Class<Foo<T>>。
  2. 有没有更好的方法可以解决这个问题?

谢谢!

PS对于那些要求更多细节的人,我们开始吧。完整的故事是 Foo 和 FooFactory 都将是外部类中的私有类。Foo 在整个外部类中被广泛使用,为了避免虚假的垃圾收集,我想使用 ObjectPool 来实例化 Foo 的实例,而不是更新它们并让它们一直被垃圾收集。但是,为了使用我的 ObjectPool,我需要一个 Factory<Foo<T>>,并且在 Outer<T> 内部,我显然不知道实例化 Outer<T> 时 T 会是什么。

public class Outer<T> {
  private class Foo<T> { ... }
  private class FooFactory<T> {...}

  private ObjectPool<Foo<T>> fooPool;

  ...
}
4

2 回答 2

4

有多种方法可以创建类型信息,Class<Foo<T>>但要执行您想要的操作,您只需在FooFactory.

在运行时,JavaObject在您编写的所有地方都使用T,因此您可以简单地实例化Foo<Object>Foo.class,它们是相同的。这称为类型擦除

泛型只是对编译器的提示。由于您的 API 确保使用的所有代码FooFactory都遵循 type T,因此您可以禁止警告并使用适当的强制转换,它会起作用。

注意:如果要保留类型信息,请实现ParameterizedType接口

于 2012-11-19T12:44:01.993 回答
0

只有一个Foo类对象,它等于Foo.class。尽管您可以编写Class<Foo<whatever>>,但这有点欺骗性,因为它都是同一个Foo类对象。当然,您需要Class<Foo<T>>能够调用newInstance()并获得Foo<T>. 因此,为了解决您需要 aClass<Foo<T>>并且Foo.class具有 type的事实Class<Foo>,您只需进行一些转换:

public FooFactory() {
  this.klass = (Class<Foo<T>>)(Class<?>)Foo.class;
}

请注意,我们根本不需要Class<T>,因为您不需要知道T创建一个Foo<T>.

于 2012-11-19T19:17:16.583 回答