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

2

从语言的角度来看,不能保证V具有不抛出、可访问、无参数的构造函数。处理这种情况的标准方法是引入抽象工厂,例如,我在此处的回答

于 2013-04-15T08:15:30.197 回答
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);

正如其他人所说,您可以创建一个可以为您执行此操作的工厂。还有另一个堆栈溢出帖子,其中包含更多信息Create instance of generic type in Java?

于 2013-04-15T07:54:24.237 回答
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 回答