1

私は今、楽しみのためにJavaに夢中になっています。

オブジェクトをコレクションに追加したいとします。コレクションの種類に関係なく。これは、T extends Collection を使用してジェネリックを使用することで簡単になります。ただし、新しいコレクションを作成して、コレクションが null の場合も処理したいとしましょう。しかし、返されるコレクションを、呼び出し元のメソッドが必要とする型にしたいのです。だから、このようなもの:

public <T extends Collection<MyObject> addToCollection (Myobject object, T collection){
    if(collection==null)
        collection=new T();

    collection.add(object);

    return collection;
}

明らかに new T() を呼び出すことはできませんが、これを行う同等の方法はありますか? リフレクションでそれを行うことはできますが、リフレクションはクラス T が何であるかを知っていると想定し、コレクションが null の場合、「collection.getClass()」を呼び出すことはできません。私の本能は、コンパイラが推論できないため、これは不可能であるということです。タイプ; 理論的には実行可能であるように思われるだけです

次のようなメソッドを作成した場合

HashSet<MyObject> set=addToCollection(object, null);

実行時に、このコレクションを呼び出すと HashSet が返されることを期待していることがわかります。したがって、理論的には、T を期待するタイプをメソッドに伝えることができ、したがって、メソッドは作成するコレクションになります。私はJavaがこれをしないと強く思っています。しかし、そうでない場合は、この機能を実装しない理由は、Sun/Oracle がそれに対処する方法をわざわざ書いていないエッジケースが多すぎるためです。または、コンパイラとランタイムが相互作用する方法について、これを不可能または非常に困難にする何かがありますか?

4

1 に答える 1

1

コレクションが null の場合、どのタイプのコレクションを作成するかをメソッドに伝える必要があります。そのために、クラスをパラメーターとして渡すことができます。

public <T extends Collection<String>> T addToCollection(String object, T collection, Class<T> clazz) {
if (collection == null)
    collection = clazz.newInstance();

collection.add(object);

return collection;
}

編集

Class.newInstance()コメントに示されているように、コンストラクターに引数がなく、既にアクセス可能な場合にのみ成功することに注意することが重要です。それ以外の場合は、使用する必要がありますConstructor.newInstance()

于 2013-04-10T16:21:13.923 に答える