私は今、楽しみのために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 がそれに対処する方法をわざわざ書いていないエッジケースが多すぎるためです。または、コンパイラとランタイムが相互作用する方法について、これを不可能または非常に困難にする何かがありますか?