繁体   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