簡體   English   中英

Java如何使用可變方法和泛型返回類型實現接口

[英]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.

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