2016-12-29 43 views
0

我正在用java編寫一個shell實現,它支持通過向Map<String, Command>添加一個Command對象並編寫與此命令關聯的類來添加新命令。java:d​​ynamic class cast

commandList.put("sort", new sort()); // sort extends Command 

每個命令具有多個OptionsDefinition<T> S的選項名稱到使用Consumer<T>物體的方法相關聯的參考(T是類的命令的:排序例如)。

我要讓引用的方法爲了能夠調用兩次相同的命令在我的殼沒有混合在同一個命令的屬性值,所以我需要傳遞sortthis的非靜態Consumer<sort>在我的sort命令的例子中。

我想知道我怎麼能改造一下我:

Command sort = commandList.getCommand("sort"); 

到:

sort sort = commandList.getCommand("sort"); 

能夠使用

option.getCallback().process(sort); // sort is the reference to this 

是否有可能做所以?

+0

如果你只有一個'sort'的實現,我只需要使用那一個實現,不需要查看它。如果你有多個實現,我會使用一個強制轉換。 –

回答

1

您可以使用隱式轉換實現getCommand。

public <C extends Command> C getCommand(String name) { 
    return (C) commands.get(name); 
} 

然後,你可以寫

Sort sort = commandMap.getCommand("sort"); 

注:

  • 類中的首字母大寫
  • 列表是由非負數訂購和索引的集合。在Java中,你可以調用由一個鍵索引的集合,一個Map。
  • 由於編譯器不知道轉換是否安全,您將在該方法中獲得未經檢查的轉換警告。你可以做些什麼來關閉它是

要壓制警告。

public <C extends Command> C getCommand(String name) { 
    @SuppressWarning("unchecked") 
    C c = (C) commands.get(name); 
    return c; 
} 
+0

在執行'return(C)commands.get(name);'時,我得到了一個未經檢查的強制轉換警告? – MaxV37

+0

@ MaxV37是的。編譯器不知道演員是否安全。只有你這樣做。 –

+0

@ MaxV37您可以取消警告,參見上文。 –