在Java中实例化函数内的类

在Java中实例化函数内的类,java,function,class,inheritance,abstract-class,Java,Function,Class,Inheritance,Abstract Class,我试图创建一个函数,用一些对象填充二维数组。我的函数如下所示: void funcName(Element el){ container[0][0] = new el(args); } 这里唯一的问题是元素是一个抽象类,所以当我试图实例化一个对象时,Java给了我一个错误。我试图做的是实例化类的对象,这些类被构建为元素的扩展(即类B扩展元素)。是否有方法将这些类作为参数传递,并让我的函数相应地创建它们?抽象类: public abstract class Element {

我试图创建一个函数,用一些对象填充二维数组。我的函数如下所示:

void funcName(Element el){
    container[0][0] = new el(args);
}
这里唯一的问题是元素是一个抽象类,所以当我试图实例化一个对象时,Java给了我一个错误。我试图做的是实例化类的对象,这些类被构建为元素的扩展(即类B扩展元素)。是否有方法将这些类作为参数传递,并让我的函数相应地创建它们?

抽象类:

public abstract class Element {

    public abstract void myMethod();
    
}
混凝土等级:

public class ArrayElement extends Element{

    @Override
    public void myMethod() {
        System.out.println("Hello!");
    }

}
呼叫必须以以下方式完成:

public class Main {
    
    public static void main(String[] args) {
        Element element = new ArrayElement();
        calculate(element);     
    }
    
    // This syntax will let you use any class that extends from the Element class, since it guarantees that is convertible to the type that you need. Are called generics.
    public static <T extends Element> void calculate(T element){
        element.myMethod();
    }

}
公共类主{
公共静态void main(字符串[]args){
元素=新数组元素();
计算(元素);
}
//此语法允许您使用从元素类扩展而来的任何类,因为它保证可以转换为所需的类型。这些类称为泛型。
公共静态空隙计算(T元素){
元素。myMethod();
}
}
试试这个

static abstract class Element {} 
static class B extends Element {}

static void funcName(Class<? extends Element> cls)
        throws InstantiationException, IllegalAccessException,
        IllegalArgumentException, InvocationTargetException,
        NoSuchMethodException, SecurityException {
    Element[][] container = new Element[1][1];
    container[0][0] = cls.getConstructor().newInstance();


不能实例化抽象类。必须实例化从所需抽象类扩展而来的具体类。让我为你们准备一个例子。是的,但通常有一个更干净的方法来做这件事。关于您的用例的更多细节将很有帮助。(例如,您可以传递一个
供应商。)
funcName(B.class);
static void funcName(Supplier<Element> s) {
    Element[][] container = new Element[1][1];
    container[0][0] = s.get();  // is equivalent to `new B()`
}
funcName(B::new);