我正在尝试实施一个U.I.用户将在控制台中键入一个值,我的程序应该调用一个函数,该函数只执行和修改某个值或执行并返回一些东西。在任何一种情况下,这个函数都可以带参数。
所以在这一点上,这基本上听起来像吸气者和制定者,但我不想以这种方式完全实现它,这是为了避免必须通过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]);
答案 0 :(得分: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");
}
}
}
答案 1 :(得分:1)
嗯,错误是明智的。接口说execute
方法可以接受任意数量的Object参数,但是实现的尝试实际上只实现了一个带有两个参数的变量(具体来说就是字符串)。所有其他变体(恰好一个参数,或三个参数,等等)都没有实现。
在避免大的if / else方面,如何添加返回布尔值的canExecute
方法。创建潜在DoActivity
实现的列表,在列表中找到第一个为true
返回canExecute
的实现,然后执行其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;
}
}