2014-10-12 52 views
1

我正在嘗試實現一個U.I.用戶將在控制檯中鍵入一個值,並且我的程序應該調用一個函數,該函數將執行並修改某個值或執行並返回一些值。無論哪種情況,這個函數都可以帶參數或不帶參數。Java如何使用可變參數方法和泛型返回類型實現接口

所以在這一點上,這聽起來像是getter和setter,但我不想完全以這種方式實現它,這是爲了避免必須通過10+ if語句才能確定要做什麼給出用戶輸入。

所以我的解決方案是創建一個有點像我這班裏面和我想要運行的每個活動接口的,我創建一個使用此接口的它的實例:

private interface DoActivity <R> { 
    public R execute(Object... param); 
} 

這工作時,我不想指定類型的參數傳遞給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]); 
+0

你的執行方法不具有相同類型的接口。一個用戶不是(或不應該)有一個'setPerson'對象,而是他們應該有一個'DoActivity'對象,它恰好是用'setPerson'對象實例化的。從方法原型來看,它們應該能夠放置任意數量的對象,而不僅僅是兩個。 – Jared 2014-10-12 02:15:37

+0

我沒有看到這是一個接口的正確使用。爲了執行該方法,需要認識到它不是'DoActivity'對象,而是'setPerson'對象。這表明'setPerson'與'DoActivity'不同,因此不應該被等同(這就是接口本質上的含義 - 對象表示相同的東西,但行爲不同)。 – Jared 2014-10-12 02:20:44

+0

@Jared'setPerson'與'DoActivity'沒有區別,注意類聲明旁邊的'implements'?這意味着'setPerson'是一個'DoActivity'對象 – smac89 2014-10-12 03:26:16

回答

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"); 
     } 
    } 
} 
+0

非常接近我所做的,但我注意到每個方法應該事實上不返回或返回一個字符串。所以我改變了返回類型爲全部字符串,每當我調用一個方法時,我都會得到它的返回值;如果它不爲空,我將打印方法返回的值。另外'params'被定義爲'String ... params' – smac89 2014-10-12 15:11:52

1

好,誤差是合理的。該接口說execute方法可以接受任意數量的Object參數,但是在實現中的嘗試只能實際實現一個接受兩個參數(特別是字符串)的變體。所有其他變體(正好一個參數或三個參數等)都未實現。

在避免大if/else方面,如何增加一個返回布爾值的方法canExecute?創建一個潛在的DoActivity實現列表,找到列表中的第一個返回truecanExecute,然後執行其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; 
    } 
} 
+0

我認爲這是一個好方法,但是,我實際上會爭辯說它現在應該更多地是抽象類而不是接口。此外,我認爲'抽象canExecute'和我會補充說,'抽象doExecute'方法都應該被保護(它們不應該被允許被任何類調用)。然後你可以通過調用'canExecute'和(如果成功)'doExecute'方法來定義'execute'方法。 – Jared 2015-04-26 05:34:49

相關問題