オブジェクトを使用してコレクションをインスタンス化する

collections generics java
オブジェクトを使用してコレクションをインスタンス化する

私は次のことをしたいと思います(それはうまくいきません、概念を説明するだけです)。 どのようにそれをする方法がありますか?

Class type;
if (/* something */)
  type = String.class;
else
  type = Boolean.class;

return new ArrayList();

`ArrayList`は機能しません。 `type.getClass()`で試しましたが、どちらも動作しません。

  2  0


ベストアンサー

それをメソッドにラップし、型を汎用の `Class`として渡し、残りをJavaに任せます。 条件分岐は不要です。

 List newList(Class type) {
    return new ArrayList();
}

それからあなたはこのようにそれを使うことができます:

List list = newList(String.class);

「T」は_generic class_レベルで指定する必要がないことに注意してください。 メソッドのジェネリック型を指定して、サンプルコードのように_generic method_にすることができます。

5


それはできません。 チェックは実行時に行われ、ジェネリックはコンパイル後に失われます。

ジェネリックの唯一の目的は、コンパイル時に型の安全性を保証することです。 この例では、実行時にタイプを決定します。

できることは、各 `if`で異なるタイプのコレクションをインスタンス化することです。

3


あなたが使用する必要があります:

public ArrayList<?> getList() {
    if (/* something */) {
        return new ArrayList();
    } else {
        return new ArrayList();
    }
}

2


型情報はJavaコンパイラーによって削除されますが、http://code.google.com/p/reflections/ [this one]などの追加パッケージからアクセスできます

1


type`は class`ではありません。この場合、複数の戻り値を持つことができます

public  List foo(T type) {
    return new ArrayList();
}

0


if節は、おそらく実行時に決定されるものです。 javaのパラメーター化された型は、コンパイル時にクリアされます。 new ArrayList()を返すだけでも同じ効果があります。

0


タイトルとURLをコピーしました