1

だから私が持っていると言う:

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

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

そして、Foo<T>を構築するためにFactoryの実装を作成したいと思います。

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;
  }
}

2つの質問:

  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

実行時に、JavaはObjectあなたが書いたすべての場所で使用するTので、単純にインスタンス化することができます。Foo<Object>またはFoo.class、それらは同じです。これは型消去と呼ばれます。

ジェネリックスはコンパイラーのヒントにすぎません。APIは、使用するすべてのコードFooFactoryが型を尊重することを確認Tするため、警告を抑制して適切なキャストを使用でき、それが機能します。

注:タイプ情報を保持する場合はParameterizedTypeインターフェースを実装してください。

于 2012-11-19T12:44:01.993 に答える
0

Fooに等しいクラスオブジェクトは1つだけFoo.classです。と書くことはできますがClass<Foo<whatever>>、それはすべて同じFooクラスオブジェクトであるため、一種の欺瞞的です。もちろん、を呼び出して取得Class<Foo<T>>できる必要があります。したがって、が必要であり、タイプがあるという事実を回避するには、いくつかのキャストを行うだけです。newInstance()Foo<T>Class<Foo<T>>Foo.classClass<Foo>

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

を作成するClass<T>ことを知る必要がないため、まったく必要ないことに注意してください。TFoo<T>

于 2012-11-19T19:17:16.583 に答える