该方法未定义类型Class <capture#3-of?=“”extends =“”command =“”> </capture#3-of>

时间:2014-03-10 01:06:12

标签: java generics casting abstract-class subclass

我有抽象类

package main;

public abstract class Command {
    protected final String key;

    public Command(String key) {
        this.key = key;
    }

    public abstract void function(String[] args);
    public abstract void help();
}

但是当我尝试调用方法function(String[] args)时,虽然方式令人困惑且过于复杂,但问题随之而来。


Class<? extends Command> x = (Class<? extends Command>) Class.forName(
        "main.Commands$" +
        String.valueOf(command.toCharArray()[0]).toUpperCase() +
        command.substring(1).toLowerCase()
);

x.function(args);

给我错误The method function(String[]) is undefined for the type Class<capture#3-of ? extends Command>

我选择尝试以下方法:

Command x = (Command) Class.forName(
        "main.Commands$" +
        String.valueOf(command.toCharArray([0]).toUpperCase() +
        command.substring(1).toLowerCase()
);

但那只是给了我Cannot cast from Class<capture#1-of ?> to Command

我提前为我糟糕的命名道歉。

1 个答案:

答案 0 :(得分:6)

Class.forName正在返回Class<?>个对象,而不是Command。您需要使用Class<?>对象中的一个构造函数创建Command。

Class<Command> klass = (Class<Command>) Class.forName(
    "main.Commands " +
    String.valueOf(command.toCharArray([0]).toUpperCase() +
    command.substring(1).toLowerCase()
);

Command x = klass.newInstance();

或者,您可以使用klass.getConstructor(...)方法