0

私はこの問題を抱えています

1 つのクラスから不要な詳細を切り取り、必要なオブジェクトを含むオブジェクトのコレクションを返すメソッド。問題は、このメソッドが異なるクラス (ただし、1 つの抽象に基づく) で動作できるようにしたいので、ジェネリック型を使用することです。問題は、ある時点で のインスタンスを作成する必要があることですが、これは不可能です。私は何らかの方法を探しましたが、私の場合はうまくいかないようです。したがって、コードは次のとおりです

 private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates ) {
    List<T> restMandates = new ArrayList<>(mandates == null ? 0
            : mandates.size());
    if (mandates != null) {
        for (CardMandate mandate : mandates) {
             restMandates.add(new T(mandate));
        }
    }

    return restMandates;
}

RestMandate は基本クラスで、CardMandate は私が情報を取得したものです。何か案は?

4

3 に答える 3

3

Type Erasureのため、 T は実行時に Object になります。あなたはもはやその本当のタイプを知りません。

クラスがある場合は、リフレクションによってオブジェクトをインスタンス化できます。そのためには、メソッドにクラスを与える必要があります。

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz ) {
  ...
  for (CardMandate mandate : mandates) {
     /*
      * I get the constructor which needs one CardMandate and call it.
      * Note : I do not recommend this solution (no check at compile-time!). 
      * Like Marko Topolnik, I advise to redesign the solution.
      */
     restMandates.add(clazz.getConstructor(CardMandate.class).newInstance(mandate));
  }
  ...
}
于 2013-09-25T10:00:38.590 に答える
3

ジェネリック型引数は実行時に消去されるため、実行しようとしているように参照する方法はありません。唯一の方法は、型タグ引数 + リフレクティブ インスタンス化です。

より良い選択は、ジェネリックや型タグに依存せずに、ソリューションを再設計してこれを解決することです。代わりに動的メソッド ディスパッチを利用RestMandateします。目的の型に変換されたオブジェクトを返すメソッドを追加します。

于 2013-09-25T09:59:42.050 に答える
1

インスタンスを作成するには、Class<T>オブジェクトも必要です

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz) {
    //....
    T newInst = clazz.newInstance();

    //....
}
于 2013-09-25T09:58:23.293 に答える