为什么Java无法在此代码中正确推断类型?

时间:2018-04-03 23:00:57

标签: java generics type-inference

仅用于演示目的的代码。

这不编译:

rendering

这会编译:

public static void main(String[] args) {
   final List<Optional<Dog>> dogs = Arrays.stream(new String[]{"a", "b"})
       .map((code) -> {
         try {
           return Optional.of(new Dog());
         } catch (RuntimeException e) {
           return Optional.empty();
         }
       })
       .collect(Collectors.toList());
 }

class Dog{}

有没有其他方法可以告诉Java第一个示例中public static void main(String[] args) { final List<Optional<Dog>> dogs = Arrays.stream(new String[]{"a", "b"}) .map((code) -> getDog(code)) .collect(Collectors.toList()); } private static Optional<Dog> getDog(String code) { try { return Optional.of(new Dog()); } catch (RuntimeException e) { return Optional.empty(); } } class Dog{} 的类型是Optional.empty()类型?

1 个答案:

答案 0 :(得分:3)

  

有没有其他方法可以告诉Java第一个示例中Optional.empty()的类型是Optional<Dog>类型?

Optional.<Dog>empty()

使用模板参数调用静态方法时,可以使用上述语法明确指定参数。

它显示在The Java™ Tutorials页面上:

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}
     

调用此方法的完整语法为:

Pair<Integer, String> p1 = new Pair<>(1, "apple");
Pair<Integer, String> p2 = new Pair<>(2, "pear");
boolean same = Util.<Integer, String>compare(p1, p2);