2

ジェネリックを使用するライブラリを作成しますが、ジェネリック型のインスタンスを作成する方法がわかりません。create メソッドの書き方を簡単に説明します。

public class Lib<V extends Base> {

    private HashMap<Integer, V> map = new HashMap<Integer, V>();    

    public V get(int key) {
        return map.get(key);
    }

    public void add(int key, V value) {
        map.put(key, value);
    }

    public void create(int key) {
        // V v = new V();  // ?? How to implement this line
        // add(key++, v);
    }
}
4

3 に答える 3

0

@Tom Hawtin - タックラインの回答を本当に検討する必要があります。それは最高で、アプローチは単に美しいです!必要なのは常に別のファクトリ実装を追加することだけですが、それは静かな少額の支払いです.

  public class InstanceOfGenericClass {
      public static void main(String[] args) {
          new GenericClass<VPassed>(new FactoryImpl()).createInstance();
      }
  }

//------------------------------------------------ ------------

 class GenericClass<V>{

     private final Factory<V> factory;
     public GenericClass(Factory<V> factory){
         this.factory = factory;
     }

     V createInstance(){
         return factory.create();
     }
 }

//------------------------------------------------ -------------

interface Factory<V>{
V create();

}

//------------------------------------------------ -------------

 class FactoryImpl implements Factory<VPassed>{
     @Override
     public VPassed create() {
         return new VPassed();
     }
 }

//------------------------------------------------ --------------

class VPassed{}
于 2013-04-15T08:58:32.620 に答える
0

ジェネリック型で new を使用することはできません。Javaのジェネリックには型消去があります。http://docs.oracle.com/javase/tutorial/java/generics/erasure.htmlを参照してください。

型の消去により、パラメーター化された型に対して新しいクラスが作成されないことが保証されます。したがって、ジェネリックはランタイム オーバーヘッドを発生させません。

ただし、ジェネリック クラスのインスタンスを取得する汚い方法がいくつかあります。例えば: -

void create(Class<V> foo)
{
    foo.newInstance(); // Create a new instance of generic type V
}

または、プライベート メンバーとして foo を作成し、'type.class' をメソッドに渡さなくてもこれを行うことができます。これにより、コンストラクターでクラスを渡します。

class bar<V>
{
    private Class<V> baz;

    private V qux;

    public bar(Class<V> foo)
    {
        baz = foo;
    }

    void create()
    {
        qux = baz.newInstance();
    }
}

bar<Integer> quxx = new bar<Integer>(Integer.class);

他の人が言ったように、これを行う工場を作成できます。詳細情報を含む別のスタック オーバーフローの投稿があります Java でジェネリック型のインスタンスを作成しますか?

于 2013-04-15T07:54:24.237 に答える