我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数。但是,Callable接口只允许一种返回参数。
它应该像这样工作:
Future<String> result =
executor.submit(ClassThatImplementsCallable(RETURN_STRING));
Future<Integer> result =
executor.submit(ClassThatImplementsCallable(RETURN_INT));
ClassThatImplementsCallable(RETURN_NOTHING);
要返回null(分别是对Void的引用)或任何其他类型(如String或Integer),我必须使用T而没有任何像这样的边界:
public static class CallableTest<T> implements Callable<T>{
T value;
CallableTest(T value) {
this.value = value;
}
public T call(){
return value;
}
}
然而,这不是我想要实现的,但是扩展Void并实现其他接口也没有意义。
答案 0 :(得分:8)
我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数。
因此,当您向Callable
提交ExecutorService
时,您将获得具有相同类型的未来:
Future<String> stringResult = executor.submit(new MyCallable<String>());
Future<Integer> stringResult = executor.submit(new MyCallable<Integer>());
无法做的事情是有一个Future result
根据参数返回两种不同类型中的一种,String
或Integer
ExecutorService
已经建成。我想这就是你要问的。
另一种方法是创建一个小包装类:
public class StringOrInteger {
final String s;
final Integer i;
public StringOrInteger(String s) {
this.s = s;
this.i = null;
}
public StringOrInteger(Integer i) {
this.s = null;
this.i = i;
}
public boolean isString() {
return this.s != null;
}
}
然后,您的遗嘱执行人将提交Callable<StringOrInteger>
,而StringOrInteger
返回的Future<StringOrInteger>
个例将会设置s
或i
字段。< / p>
非常难看的替代方法是返回Object
并使用instanceof
来确定它是什么类型。但我甚至不会显示该实现的代码,因为它会给我荨麻疹。
答案 1 :(得分:1)
您可以将命令模式与访客模式一起使用。
定义一个命令类,并将处理逻辑与参数和返回类型一起包装在一起。然后将此命令对象作为参数传递,并将其用作结果类型。
稍后在您的代码中,您可以使用访问者模式来处理两个具体的命令。