推理变量K具有不兼容的边界

时间:2015-05-19 22:28:02

标签: generics java-8

我正在尝试为所述问题here编写解决方案,因为Stuart Marks指出要使用帮助程序类。由于这个错误,我卡在了代码上:

Test.java:27: error: incompatible types: inference variable K has incompatible bounds                                                                                                                          
         .collect(Collectors.groupingBy(p -> p.getT2()));                                                                                                                                                      
                 ^                                                                                                                                                                                             
    equality constraints: Tuple                                                                                                                                                                                
    lower bounds: Integer                                                                                                                                                                                      
  where K,T are type-variables:                                                                                                                                                                                
    K extends Object declared in method <T,K>groupingBy(Function<? super T,? extends K>)                                                                                                                       
    T extends Object declared in method <T,K>groupingBy(Function<? super T,? extends K>) 

我目前的代码:

import java.util.stream.IntStream;
import java.util.stream.Collectors;
import java.util.Map;

public class Test{

    private static final class Tuple {
        private final Integer t1;
        private final Integer t2;

        private Tuple(final Integer t1, final Integer t2) {
            this.t1 = t1;
            this.t2 = t2;
        }

        public Integer getT1() { return t1; }
        public Integer getT2() { return t2; }
    }

     public static void main(String []args){
        System.out.println("Hello World");

        Map<Tuple, Integer> results =
        IntStream.range(1, 10).boxed()
         .map(p -> new Tuple(p, p % 2))                     // Expensive computation
         .filter(p -> p.getT2() != 0)
         .collect(Collectors.groupingBy(p -> p.getT2())); 

        results.forEach((k, v) -> System.out.println(k + "=" + v));
     }

}

我自己对Java 8很新,解决方案可能有问题,但我不知道错误的含义或解决方法。 Tuple类过去也是通用的,但是因为我认为这导致了问题我删除了泛型类型,但仍然存在相同的错误。

1 个答案:

答案 0 :(得分:4)

collect()groupingBy()不按照您的想法行事。您现在分配的结果类型是:

Map<Integer, List<Tuple>> results = ...

换句话说,您按p.getT2()Integer)进行分组,并在每个群组中将该群组的元组收集到List<Tuple>中,结果如下:

1=[Test$Tuple@7699a589, Test$Tuple@58372a00, Test$Tuple@4dd8dc3, 
   Test$Tuple@6d03e736, Test$Tuple@568db2f2]