使用Optional时的Java Generic Type Erasure

时间:2017-04-26 23:38:30

标签: java optional

课堂上的定义:

class XXX {
    Map<String, Class> someMap;

    public <K, V>
    Optional<V> get(K key) {
        return Optional.ofNullable(getNullable(key));
    }

    public <K, V>
    V getNullable(K key) {
        //someMap already holds key -> class of V
        String value = DB.fetch(key);

        return gson.fromJson(value, someMap.get(key.toString()));
    }
}

用法:

//xxx is an instance of XXX
Optional<ClassA> valueOpt = xxx.get(key); //this is fine
ClassA value = valueOpt.get(); //this is fine

//The intermediate valueOpt seems redundant, try to bypass it.
ClassA value = xxx.get(key).get(); //this does not work

我的问题:在最后一行,似乎类型信息是可推断的,为什么它不能工作?使其在一行中工作的任何解决方法?

变通方法摘要:
1)xxx.get(key, ClassA.class)
2)(ClassA)xxx.get(key)
3)xxx.<K,ClassA>get(key)

我仍然觉得这些都是变通办法,因为ClassA value = xxx.getNullable(key);可以工作。

1 个答案:

答案 0 :(得分:0)

您可以明确使用方法类型参数:

ClassA value2 = xxx.<String, ClassA>get(key).get();