我的代码应该从实现接口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);
}
答案 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);
}