从实现接口的类调用方法(java)

时间:2014-02-13 23:21:37

标签: java inheritance methods interface extends

我的代码应该从实现接口InputType的非特定类调用handleInput(String)方法;这是为了强制所有处理程序类可以在这里使用方法handleInput(String),以及其他一些方法。

我这样做错了吗? Eclipse说那个

The method handleInput(String) is undefined for the type
Class<capture#5-of ? extends InputType>

代码:

public void registerNewInput(String name, Class<? extends InputType> typeHandler)
{
    inputHandlers.put(name, typeHandler);
}

public void handleInput(String handlerName, String input)
{
    Class<? extends InputType> handler = (Class<? extends InputType>) inputHandlers.get(handlerName);
    handler.handleInput(input);
}

3 个答案:

答案 0 :(得分:0)

您正在使用,而不是InputType实例。您必须创建该类的实例,然后在其上调用handleInput

public void handleInput(String handlerName, String input)
{
    Class<? extends InputType> clazz = inputHandlers.get(handlerName);
    InputType handler = clazz.newInstance();
    handler.handleInput(input);
}

但这似乎相当复杂。你有没有理由存储处理程序的类而不是处理程序本身的实例?你可以轻而易举地做到这一点:

public void registerNewInput(String name, InputType inputType) {
    inputHandlers.put(name, inputType); //This assumes your map is of type Map<String, InputType>
}

public void handleInput(String handlerName, String input) {
    InputType inputType = InputType inputHandlers.get(handlerName);
    inputType.handleInput(input);
}

答案 1 :(得分:0)

如果handler应该是某个实现InputType的类,那么只需声明它:

InputType handler = inputHandlers.get(handlerName);

每当你声明一个这样的变量时:

SomeClass x;

这意味着,在运行时,x可以是SomeClass 或SomeClass 的任何子类。对于接口,x可以是实现接口的任何类。我猜这就是你想用Class<? extends InputType>说的话。

编辑:如果我猜对了你想要做的事情,那么应该在任何地方都将Class<? extends InputType>更改为InputType,包括{{1 } {} {}}参数,typeHandler类型参数,如果您使用的话。 registerNewInput对象是一种特殊类型的对象,可用于为您提供关于类的信息;不要使用该类型来声明应该只是在某个未知类中的对象。 (另一方面,如果你确定想要一个Map对象,请澄清你想要完成的事情。)

答案 2 :(得分:0)

您不需要泛型来完成此任务。只需使用界面名称作为您的类型:

public void registerNewInput(String name, InputType typeHandler)
{
    inputHandlers.put(name, typeHandler);
}

public void handleInput(String handlerName, String input)
{
    InputType handler = (InputType) inputHandlers.get(handlerName);
    handler.handleInput(input);
}

这里不需要泛型的原因是因为Java类型总是可以分配给更通用类型的变量。即 - 如果Circle延长Shape,则可以将Circle分配给Shape类型的引用:

Shape s = new Circle();  // works just fine

因此,在此示例中,它允许您将参数声明为类型InputType,并在调用方法时传递实现InputType的任何内容。

此外,您可以通过参数化地图来保存演员

private Map<String, InputType> inputHandlers;

public void registerNewInput(String name, InputType typeHandler)
{
    inputHandlers.put(name, typeHandler);
}

public void handleInput(String handlerName, String input)
{
    InputType handler = inputHandlers.get(handlerName); // no cast needed here
    handler.handleInput(input);
}