可以使用不同的返回类型调用

use*_*379 5 java parallel-processing multithreading callable

我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数.但是,Callable接口只允许一种返回参数.

它应该像这样工作:

Future<String> result =
       executor.submit(ClassThatImplementsCallable(RETURN_STRING));
Future<Integer> result =
       executor.submit(ClassThatImplementsCallable(RETURN_INT));

ClassThatImplementsCallable(RETURN_NOTHING);
Run Code Online (Sandbox Code Playgroud)

要返回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;   
    }    
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是我想要实现的,但是扩展Void并实现其他一些接口也没有意义.

Gra*_*ray 9

我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数.

所以,当你提交CallableExecutorService,你得到相同类型的未来:

Future<String> stringResult = executor.submit(new MyCallable<String>());
Future<Integer> stringResult = executor.submit(new MyCallable<Integer>());
Run Code Online (Sandbox Code Playgroud)

不能做的是有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,你的执行将提交Callable<StringOrInteger>和的情况下,StringOrInteger通过返回的Future<StringOrInteger>意愿,无论是si字段将被设置.

一个非常难看的替代方案是返回Object并使用它instanceof来确定它是什么类型.但我甚至不会显示该实现的代码,因为它会给我荨麻疹.