相关疑难解决方法(0)

通用类型推断无法使用方法链接?

此代码在Java 8中编译,但无法在Java 7中编译:

class Map<K,V> {
    static <K,V> Map<K,V> empty() {return null;}
    Map<K,V> put(K k, V v) {return null;}
    V get(K k) {return null;}
}

class A {
    static void f(Map<Integer,String> m){}
    public static void main(String[] args) {
        f(Map.empty());
    }
}
Run Code Online (Sandbox Code Playgroud)

它不会推断出Map返回的具体类型Map.empty():

$ javac7 A.java
A.java:10: error: method f in class A cannot be applied to given types;
        f(Map.empty());
        ^
  required: Map<Integer,String>
  found: Map<Object,Object>
  reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation …
Run Code Online (Sandbox Code Playgroud)

java generics type-inference java-7 java-8

27
推荐指数
1
解决办法
2334
查看次数

Java 8 Streams:为什么Collectors.toMap对于带有通配符的泛型有不同的行为?

假设你有一个List数字.在该值List可以是类型的Integer,Double等等.当你声明这样的List有可能使用一个通配符(声明它?)或不用一个通配符.

final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
Run Code Online (Sandbox Code Playgroud)

所以,现在我想streamListcollect它所有的Map使用Collectors.toMap(显然下面的代码只是为了说明问题的例子).让我们开始流式传输numberList:

final List<Number> numberList = Arrays.asList(1, 2, 3D, 4D);

numberList.stream().collect(Collectors.toMap(
        // Here I can invoke "number.intValue()" - the object ("number") is treated as a Number
        number -> Integer.valueOf(number.intValue()),
        number -> number));
Run Code Online (Sandbox Code Playgroud)

但是,我不能对以下内容做同样的操作wildcardList:

final List<? extends Number> wildCardList …
Run Code Online (Sandbox Code Playgroud)

java generics lambda java-8 collectors

27
推荐指数
1
解决办法
2万
查看次数

标签 统计

generics ×2

java ×2

java-8 ×2

collectors ×1

java-7 ×1

lambda ×1

type-inference ×1