重新编码从callable返回值的future

时间:2015-09-21 22:42:37

标签: java

我的Callable会返回Map,因此当我将其分配给Future并打印出其内容时,会显示{necessities=300, investment=100, savings=200}

但我如何实际阅读上述值?我试图重新分配我从未来to Map<String,String>获得的值,但是我得到了一个不兼容的类型错误。

我的地图是Map<String, String>。这是返回数据的Callable(在kucing.java中):

public Callable<Map<String, String>> getData() {
        return new Callable() {
            public Map<String, String> call() {
                return getDataFromDatabase();
            }
        };
    }

以下是我将数据检索到Future

的方式
Future myResult = es.submit(kucing.getData());

Observable<Future> myObservable = Observable.just(myResult);

Subscriber<Future> mySubscriber = new Subscriber<Future>() {

            @Override
            public void onNext(Future future) {
                Log.v(FILE_NAME,"future: " + future.toString());
                try{
                    Log.v(FILE_NAME,"future: " + future.get().toString());
                    Map<String, String> map = future.get();
                }catch (Exception e){
                    Log.e(FILE_NAME,"future e: " + e.toString());
                }

            }
        };

1 个答案:

答案 0 :(得分:1)

Future myResult = es.submit(kucing.getData());

此Future具有原始类型:您实际上并不知道其返回值的类型(尽管您知道它将是一个Object)。

Map<String, String> map = myResult.get(); // Compiler error.
Object obj = myResult.get(); // OK.

您需要提供完整类型:

Future<Map<String, String>> myResult = es.submit(kucing.getData());
Map<String, String> map = myResult.get();  // OK.

如果您想在此观察员/订阅者模式中使用未来,则需要将所有Future替换为Future<Map<String, String>>