2016-06-08 35 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); 
    } 
} 

祝你好運!