[英]Java how to implement interface with a variadic method and generic return type
我正在嘗試實現一個UI,在用戶將在控制台中鍵入一個值,我的程序應該調用一個函數,該函數將只執行和修改某個值或執行並返回一些東西。 在任何一種情況下,這個函數都可以帶參數。
所以在這一點上,這基本上聽起來像getter和setter,但我不想以這種方式完全實現它,這是為了避免必須通過10+ if語句來確定如何為任何給定的用戶輸入做什么。
所以我的解決方案是在我的類中創建一個這樣的接口,並且對於我想要運行的每個活動,我使用這個接口創建它的一個實例:
private interface DoActivity <R> {
public R execute(Object... param);
}
這適用於我不想指定要傳遞給execute方法的參數類型的情況,但是當我使用它的execute方法創建這樣的DoActivity實例時:
private class setPerson implements DoActivity {
@Override
public Void execute(String name, String telephone) {
...
return null;
}
}
我得到了上面的錯誤: method does not implement or override a method from supertype
有沒有辦法做我想要的而不訴諸反射?
樣品用途:
// at prompt
>> Enter an operation: 1 Bumble Bee
>> ...
// In program
String input = "1 Bumble Bee";
String split[] = input.split();
int operation = Integer.parseInt(split[0]);
DoActivityArray[operation - 1].execute(split[1], split[2]);
對於您的特定示例,解決方案實際上非常簡單:
private class setPerson implements DoActivity{
@Override
public Object execute(final Object ...params){
if(params.length != 2)
throw new RuntimeException(
"setPerson must take an array of exactly two strings");
try{
final String name = (String)params[0];
final String telephone = (String)params[1];
...
return null;
} catch(ClassCastException cce){
throw new RuntimeException(
"setPerson must take an array of exactly two strings");
}
}
}
嗯,錯誤是明智的。 接口說execute
方法可以接受任意數量的Object參數,但是實現的嘗試實際上只實現了一個帶有兩個參數的變量(具體來說就是字符串)。 所有其他變體(恰好一個參數,或三個參數,等等)都沒有實現。
在避免大的if / else方面,如何添加一個返回布爾值的canExecute
方法。 創建一個潛在的DoActivity
實現列表,找到列表中第一個為canExecute
返回true
的方法,然后執行其execute
方法,該方法假定參數的類型和數量。
interface DoActivity<R> {
public boolean canExecute(Object... param);
public R execute(Object... param);
}
class SetPerson implements DoActivity {
@Override
public Void execute(Object... param) {
String name = (String)param[0];
String telephone = (String)param[1];
...
}
@Override
public boolean canExecute(Object... param) {
return param != null && param.length == 2;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.