2016-06-08 34 views
3

我想创建一个相当简单的CollectorStream<Map.Entry>转换为Map,但javac抱怨泛型。无法弄清楚为什么它无法正常工作。通用toMap收集器不能编译

import java.util.Map; 
import java.util.Map.Entry; 
import java.util.stream.Collector; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

public class CollectorSO { 
    public static <K, V> void main(String[] args) { 
     Collector<Entry<K, V>, ?, Map<K, V>> collector = Collectors.toMap(Entry::getKey, Entry::getValue); 
     Stream<Entry<String, Object>> stream = Stream.empty(); 
     Map<String, Object> map = stream.collect(collector); 
    } 
} 

编译器输出:

Error:(11, 41) java: no suitable method found for collect(java.util.stream.Collector<java.util.Map.Entry<K,V>,capture#1 of ?,java.util.Map<K,V>>) 
method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super java.util.Map.Entry<java.lang.String,java.lang.Object>>,java.util.function.BiConsumer<R,R>) is not applicable 
    (cannot infer type-variable(s) R 
    (actual and formal argument lists differ in length)) 
method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super java.util.Map.Entry<java.lang.String,java.lang.Object>,A,R>) is not applicable 
    (cannot infer type-variable(s) R,A 
    (argument mismatch; java.util.stream.Collector<java.util.Map.Entry<K,V>,capture#1 of ?,java.util.Map<K,V>> cannot be converted to java.util.stream.Collector<? super java.util.Map.Entry<java.lang.String,java.lang.Object>,A,R>)) 

This表面上看起来相似,但我有甚至JDK 1.8.0_60问题。

回答

5

这是因为您为主方法声明的类型变量。他们不会在这种情况下被捕获,因此您无法通过Entry<K, V>, ?, Map<K, V>收集器收集您的Entry<String, Object>流。你在看什么可能是这样的:

public class CollectorSO 
{ 
    public static void main(String[] args) 
    { 
     Stream<Entry<String, Object>> stream = Stream.empty(); 
     Map<String, Object> map = stream.collect(entryToMapCollector()); 
    } 

    private static <K, V> Collector<Entry<K, V>, ?, Map<K, V>> entryToMapCollector() 
    { 
     return Collectors.toMap(Entry::getKey, Entry::getValue); 
    } 
} 

祝你好运!