[英]Calling protected method “Front” from ListQueue class, which implements Queue interface
[英]calling a method from a class that implements an interface (java)
我的代碼應該從實現接口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);
}
您正在使用該類,而不是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);
}
如果handler
應該屬於實現InputType
的某個類,則只需像這樣聲明它:
InputType handler = inputHandlers.get(handlerName);
每當您聲明這樣的變量時:
SomeClass x;
這意味着在運行時, x
可以是SomeClass
或 SomeClass
任何子類 。 對於接口, x
可以是實現該接口的任何類。 我猜這就是您要對Class<? extends InputType>
說的話Class<? extends InputType>
Class<? extends InputType>
。
編輯:如果我已經正確猜到了您要做什么,然后更改Class<? extends InputType>
Class<? extends InputType>
為InputType
應該在任何地方進行,包括registerNewInput
的typeHandler
參數,如果使用的是Map
類型,則應在Map
類型中進行。 Class
對象是一種特殊的對象類型,可用於為您提供有關類的信息。 不要使用類型來聲明應該屬於某個未知類的對象。 (在另一方面,如果你真的確定你想要一個Class
的對象,請說明你要完成的任務。)
您不需要泛型即可完成此操作。 只需使用接口名稱作為您的類型:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.