Java 用泛型类型实例化抽象类的对象

Java 用泛型类型实例化抽象类的对象,java,generics,abstract-class,Java,Generics,Abstract Class,我正在创建一个具有泛型类型的函数,该泛型类型是我需要实例化的抽象类型。此代码将更清楚地解释: public <T extends AbstractRow> foo(){//no I did not actually name the function foo ArrayList<T> arr=new ArrayList<T>(); arr.add(new T(...)); //cant instantiate objects of abstra

我正在创建一个具有泛型类型的函数,该泛型类型是我需要实例化的抽象类型。此代码将更清楚地解释:

public <T extends AbstractRow> foo(){//no I did not actually name the function foo
    ArrayList<T> arr=new ArrayList<T>();
    arr.add(new T(...)); //cant instantiate objects of abstract class


}
public foo(){//不,我没有实际命名函数foo
ArrayList arr=新的ArrayList();
arr.add(new T(…);//无法实例化抽象类的对象
}
基本上,我想强制执行“T扩展AbstractRow,但不是抽象本身”


我意识到你不能实例化抽象类,所以我想要一个解决方法或其他方法的建议,让我模拟创建泛型类型对象的行为。

你的主要问题不是你在使用抽象类,在这种情况下,注释中的建议会很有用。更大的问题是,您试图直接实例化泛型类型(读:
newt()
)——简单地说,这在Java中是无法做到的,因为

也就是说,总有一个解决办法:

/**@param clazz the subclass you want to instantiate */
public <T extends AbstractRow> foo(Class<T> clazz) { 
    ArrayList<T> arr = new ArrayList<T>();
    arr.add(clazz.newInstance); //instantiate new instance of given subclass
}
/**@param clazz要实例化的子类*/
公开课{
ArrayList arr=新的ArrayList();
arr.add(clazz.newInstance);//实例化给定子类的新实例
}
用法:

abstract class Test1  {} 
class Test2 extends Test1{ }

class Test<T> {
   public static <T extends Test1> T foo(Class<T> clazz) {
     T toReturn = null;
     try{ toReturn = clazz.newInstance(); } catch (Exception e) { };
     return toReturn ;
  }

  public static void main(String[] args) {
    Test1 t1 = t.foo(test2.class);
    System.out.println(t1.getClass()); //prints "class pkgname.test2"
  }
}
抽象类Test1{}
类Test2扩展了Test1{}
课堂测试{
公共静态T-foo(课堂){
T toReturn=null;
尝试{toReturn=clazz.newInstance();}catch(异常e){};
回归回归;
}
公共静态void main(字符串[]args){
test1t1=t.foo(test2.class);
System.out.println(t1.getClass());//打印“class pkgname.test2”
}
}

据我所知,有两种方法可以做到这一点:

  • 在抽象泛型类中添加
    类类型
    字段,并通过构造函数(或其他方法)进行设置。然后可以调用
    type.newInstance()
    来创建对象
  • 使用
    T Create()
    方法创建工厂接口
    factory
    ,并通过构造函数(或其他方法)将其设置为抽象类上的字段。在创建泛型类的具体实例时,还必须传递所述工厂的具体实现
  • import java.util.ArrayList;
    导入java.util.List;
    公共类泛型{
    私营工厂;
    公共通用(工厂){
    这个工厂=工厂;
    }
    公共图书馆{
    列表=新的ArrayList();
    list.add(factory.create());
    }
    }
    接口工厂{
    T create();
    }
    
    用法:

    Generic concrete=新的Generic(新工厂(){
    @凌驾
    公共酒吧创建(){
    返回新条();
    }
    });
    concrete.foo();
    
    除非实现所有抽象方法,否则无法实例化抽象类。我意识到这一点。我需要一个“变通方法”或一些如何使这样一个实现工作的想法,我需要实例化泛型类型的对象,因为什么时候可以直接实例化泛型类型?@drewmore如果你有一个非抽象子类
    AbstractRow
    ,你可以做
    T=(T)new subclass name()
    @Christian是的,您可以,但这并不是直接实例化泛型类型,而是实例化具体类型并将其转换为泛型类型