【问题标题】:Instantiate a class inside a function in Java在Java中的函数内实例化一个类
【发布时间】:2020-12-16 22:10:20
【问题描述】:

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

void funcName(Element el){
    container[0][0] = new el(args);
}

这里唯一的问题是 Element 是一个抽象类,所以当我尝试实例化一个对象时,Java 会给我一个错误。我想要做的是实例化作为元素扩展构建的类的对象(即 B 类扩展元素)。有没有办法将这些类作为参数传递,并让我的函数相应地创建它们?

【问题讨论】:

  • 你不能实例化一个抽象类。您必须实例化一个从您需要的抽象类扩展而来的具体类。让我为你准备一个例子。
  • 是的,但通常有一种更简洁的方法来执行此操作。有关您的用例的更多详细信息会有所帮助。 (例如,您可以传递Supplier<? extends Element>。)

标签: java function class inheritance abstract-class


【解决方案1】:

抽象类:

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();
    }

}

【讨论】:

    【解决方案2】:

    试试这个。

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多