问题描述
我正在尝试创建一个函数,该函数用某些对象填充2d数组。我的功能如下:
void funcName(Element el){
container[0][0] = new el(args);
}
这里唯一的问题是Element是一个抽象类,因此当我尝试实例化对象时,Java给我一个错误。我想做的是实例化作为Element扩展构建的类的对象(即Class B扩展Element)。有没有办法将这些类作为参数传递,并让我的函数相应地创建它们?
解决方法
抽象类:
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();
}
}
,
尝试一下。
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);