java - Java中继承的静态方法中获取类名

标签 java inheritance java-8 static

假设我想用 Java 解决一堆 Project Euler 问题,而不是为每个问题类提供其自己的 main 方法的样板,而是继承它并拥有一个“解决”方法。

有没有办法让问题类的名称与解决方案一起打印出来?

我有什么:

abstract class Problem {

    private static String problemName = ???

    public static void main(String[] args) {
//  If I could summon an instance of the sub-class then it would be easy
//        Problem p = new ... what?
        System.out.println(problemName + ": " + solve());
    }

    abstract static long solve();
// oops, you can't do abstract static in Java :(
}

然后

public class Euler_001 extends Problem {
    static long solve() {...}
}

问题在于获取 this answer 中给出的类名的各种技巧。返回“Problem”,而不是“Euler_001”。

我想我必须实例化问题类,但是我该怎么做呢?

最佳答案

静态上下文无助于父级需要调用子级的继承。使用具有抽象的实例:

abstract class Problem {

    public static void main(String[] args) throws Exception {

        Problem problem;

        //Now, depending on where the exact problem is specified:

        //Class known at compile time
        problem = new Euler_001();

        //Class passed as parameter
        problem = (Problem) Class.forName(args[0]).getConstructor().newInstance();

        System.out.println(problem.getProblemName() + ": " + problem.solve());
    }

    abstract long solve();
    abstract String getProblemName();
}

子类将提供一个重写抽象方法的普通实现:

class Euler_001 extends Problem {
    @Override
    long solve() {
         return 0;
     }

    @Override
    String getProblemName() {
        return "????";
    }
}

根据您的配置方法,您可以在父级的 main 方法内根据类名创建具体类的实例。

这样,就可以通过以下方式调用 Problem 类:

java com.mypackage.Problem "com.mypackage.Euler_001"

关于java - Java中继承的静态方法中获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52442830/

相关文章:

java - 将 JSTL 包含到 Maven 项目中

c++ - 从派生的复制构造函数调用基的移动构造函数

javascript - AngularJS中范围原型(prototype)/原型(prototype)继承的细微差别是什么?

java - Android Studio - 加载 JSON 时出现问题

java - 为什么在 Spark/Dataproc 上运行它需要这么长时间?

java - 涉及实现接口(interface)的实现问题

java - Java 8中通过串口发送和接收数据的多平台方式?

java - 功能接口(interface)方法引用

java - Apache Nifi 的升级路径

java - 防止 Hibernate 架构更改