Java-generics-no-instance

提供:Dev Guides
移動先:案内検索

Java Generics-インスタンスなし

型パラメーターを使用して、メソッド内でオブジェクトをインスタンス化することはできません。

public static <T> void add(Box<T> box) {
  //compiler error
  //Cannot instantiate the type T
  //T item = new T();
  //box.add(item);
}

このような機能を実現するには、リフレクションを使用します。

public static <T> void add(Box<T> box, Class<T> clazz)
   throws InstantiationException, IllegalAccessException{
   T item = clazz.newInstance();  //OK
   box.add(item);
   System.out.println("Item added.");
}

package com.finddevguides;

public class GenericsTester {
   public static void main(String[] args)
      throws InstantiationException, IllegalAccessException {
      Box<String> stringBox = new Box<String>();
      add(stringBox, String.class);
   }

   public static <T> void add(Box<T> box) {
     //compiler error
     //Cannot instantiate the type T
     //T item = new T();
     //box.add(item);
   }

   public static <T> void add(Box<T> box, Class<T> clazz)
      throws InstantiationException, IllegalAccessException{
      T item = clazz.newInstance();  //OK
      box.add(item);
      System.out.println("Item added.");
   }
}

class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }
}

これは、次の結果を生成します-

Item added.