Java 泛型类型类初始化

Java 泛型类型类初始化,java,generics,Java,Generics,我们编写了一个使用泛型的库,我不知道如何创建泛型类型的实例。如何编写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

我们编写了一个使用泛型的库,我不知道如何创建泛型类型的实例。如何编写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);
    }
}
公共类库{
private HashMap map=new HashMap();
公共V get(int键){
返回map.get(key);
}
公共无效添加(整数键,V值){
map.put(键、值);
}
公共void创建(int键){
//V=新的V();/?如何实现这一行
//添加(键++,v);
}
}

不能将new与泛型类型一起使用;java中的泛型具有类型擦除。看

类型擦除确保没有为参数化类型创建新类;因此,泛型不会产生运行时开销

不过,获取泛型类实例有两种肮脏的方法;例如:-

void create(Class<V> foo)
{
    foo.newInstance(); // Create a new instance of generic type V
}
void创建(类foo)
{
foo.newInstance();//创建泛型类型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);
类栏
{
私家班;
私人V-qux;
公共酒吧(富级)
{
baz=foo;
}
void create()
{
qux=baz.newInstance();
}
}
bar quxx=新的bar(整数类);

正如其他人所说,你可以创建一个工厂来为你做到这一点。另一个堆栈溢出帖子包含了更多信息,从语言的角度来看,不能保证
V
有一个非抛出、可访问、无参数的构造函数。处理这种情况的标准方法是引入一个抽象工厂,例如,

< P>你应该真正地考虑@ Tom Hawtin -克拉德线的答案。这是最好的,而且方法非常漂亮!所需要的只是一直添加另一个工厂实现,但这是一个安静的小额支付

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

你要创建什么?这是不可能的,(你可能想删除那个静态字段。)(编辑:哦,我会的。)FFS,不要使用反射。(谢天谢地,Java足以阻止代码编译。否决票是完全必要的吗?我已经建议使用工厂来解决这个问题,并提供了一个链接,该链接指向一个问题,该问题的答案是赞成使用工厂来解决这个问题。.建议使用反射来解决这个问题是危险的。是的,它值得否决票。@Tomhawtenta)ckline您的方法简直令人震惊!谢谢您的建议。
 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{}