当前位置: 首页 > 知识库问答 >
问题:

如何在用类参数化的java中创建构造函数?

沙海
2023-03-14

我想有一个java中的构造函数参数化一个类来运行这个类,类似于这个

class MyClass{
    Class classToRun;
    public MyClass(Class c) {
        super();
        this.classToRun = c;
    }
    public void runClass(){
        classToRun.someStaticMethod();
    }
}

其中classToRun可能的类没有共同的祖先,但都有方法someStaticMethod。

但也存在一些问题,比如内部类不能有静态方法,类不能被转换为类,等等。

有一些用类方法参数化的解决方案,如

如何在Java中传递类作为参数?

在java中将类作为参数传递给方法

但对建造者来说不是。

这样做的正确解决方案是什么?

共有3个答案

杨和蔼
2023-03-14

如果您想在只有Class实例时执行方法,则必须使用反射

在下面的代码中,runClass找到使用其名称作为String的类的方法,然后执行它。这段代码假定方法是静态的,也忽略了任何异常处理。

以下代码打印“测试”:

class MyClass {
    Class classToRun;
    public MyClass(Class c) {
        this.classToRun = c;
    }
    public void runClass() throws Exception {
        Optional<Method> method = Arrays.stream(classToRun.getDeclaredMethods()).filter(m -> m.getName().equals("someStaticMethod")).findFirst();
        if(!method.isPresent()) {
            throw new RuntimeException();
        }
        method.get().invoke(null);
    }
}


class Main {
    public static void main(String[] args) throws Exception {
        MyClass mc = new MyClass(Main.class);
        mc.runClass();
    }

    static void someStaticMethod() {
        System.out.println("test");
    }
}
左丘凡
2023-03-14

你需要了解什么是泛型。

界面

public interface SomeInterface {
    void someStaticMethod();
}

使用

class MyClass<T extends SomeInterface>{
    T classToRun;
    public MyClass(T c) {
        super();
        this.classToRun = c;
    }
    public void runClass(){
        classToRun.someStaticMethod();
    }
}
龙才俊
2023-03-14

使用lambdas并传递方法引用:它们在方法签名上匹配。你可以使用Runnable.

class MyClass{
    private final Runnable methodToRun;
    public MyClass(Runnable someStaticMethod) {
        methodToRun = someStaticMethod;
    }
    public void runClass(){
        methodToRun.run();
    }
}

new MyClass(SomeClass::someStaticMethod).runClass();

您不能强制要求传递的方法具有正确的名称,但看起来更整洁。

 类似资料:
  • 我在创建对象和参数化构造函数时遇到以下错误。 Main.java: 6:错误:构造函数Cipher类中的Cipher不能应用于给定类型 必需:无参数 找到:int 原因:实际参数列表和正式参数列表的长度不同 这是我的文件的样子

  • 问题内容: 例如: 清除代码。 但是,如果我添加带有参数的构造函数,则如下所示: 我懂了: 因此,不,我不知道如何通过构造函数传递参数。 请帮忙。 问题答案: 您需要说出您要使用pass it参数的构造函数。

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。

  • 这是我的代码: 以下是我的任务要求: 一个参数化构造函数,将接收endpoint(作为点)、方向(作为int)和样式(作为字符串)。如果接收到的点或字符串为空,则抛出新的IllegalArgumentException( 我知道我检查样式是虚线、虚线还是双精度的部分出了问题,因为当我把它注释出来时,除了那个部分,所有的东西都工作了。就现在的情况而言,它只是在所有事情上抛出了非法的辩论例外。 我有一

  • 我有一个有两个构造函数的类。 有一个具有两个构造函数的类Sample。需要在Sample类中实例化另外三个类(ClassOne,ClassTwo和ClassIII)。所有三个类都包含默认和参数化构造函数。如果调用了Sample类的默认构造函数,则应调用ClassOne,ClassTwo和ClassIII的默认辅助构造函数。如果调用Samples参数化构造函数,则调用ClassOne、ClassII

  • 我想出的在方括号内的类名后面添加args的各种想法也都崩溃了。