簡體   English   中英

從實現接口的類中調用方法(java)

[英]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應該在任何地方進行,包括registerNewInputtypeHandler參數,如果使用的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM