前一段時間,我發現有關使用Java 8初始化映射的更清晰方式的以下信息:http://minborgsjavapot.blogspot.com/2014/12/java-8-initializing-maps-in-smartest-way.html。使用Map和Collector混淆java泛型錯誤
使用這些準則,我已採取了下列類在一個應用程序:
public class MapUtils {
public static <K, V> Map.Entry<K, V> entry(K key, V value) {
return new AbstractMap.SimpleEntry<>(key, value);
}
public static <K, U> Collector<Map.Entry<K, U>, ?, Map<K, U>> entriesToMap() {
return Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue());
}
public static <K, U> Collector<Map.Entry<K, U>, ?, ConcurrentMap<K, U>> entriesToConcurrentMap() {
return Collectors.toConcurrentMap((e) -> e.getKey(), (e) -> e.getValue());
}
}
在這種應用中,我實施了這樣的代碼:
public Map<String, ServiceConfig> serviceConfigs() {
return Collections.unmodifiableMap(Stream.of(
entry("ActivateSubscriber", new ServiceConfig().yellowThreshold(90).redThreshold(80)),
entry("AddAccount", new ServiceConfig().yellowThreshold(90).redThreshold(80).rank(3)),
...
).
collect(entriesToMap()));
}
此代碼工作完全正常。
在一個不同的應用程序中,我將MapUtils類複製到一個包中,並將該類導入到一個類中,就像我在其他應用程序中那樣。
我輸入了以下引用此:
Map<String, USLJsonBase> serviceRefMap =
Collections.unmodifiableMap(Stream.of(
entry("CoreService", coreService),
entry("CreditCheckService", creditCheckService),
entry("PaymentService", paymentService),
entry("AccountService", accountService),
entry("OrdercreationService", orderCreationService),
entry("ProductAndOfferService", productAndOfferService),
entry("EquipmentService", equipmentService),
entry("EvergentService", evergentService),
entry("FraudCheckService", fraudCheckService)
).
collect(entriesToMap()));
在「收」的呼叫,Eclipse是告訴我下面的:
The method collect(Collector<? super Map.Entry<String,? extends USLJsonBase>,A,R>) in the type Stream<Map.Entry<String,? extends USLJsonBase>> is not applicable for the arguments (Collector<Map.Entry<Object,Object>,capture#1-of ?,Map<Object,Object>>)
需要什麼簡單的,完全不顯着變化讓這個工作?
更新:
我認爲這增加了一絲類型可能做到這一點,但我不明白,爲什麼在其他應用程序的使用並不需要這個。
我改變了參考這個,現在不給我一個編譯錯誤:
Map<String, USLJsonBase> serviceRefMap =
Collections.unmodifiableMap(Stream.<Map.Entry<String, USLJsonBase>>of(
entry("CoreService", coreService),
entry("CreditCheckService", creditCheckService),
entry("PaymentService", paymentService),
entry("AccountService", accountService),
entry("OrdercreationService", orderCreationService),
entry("ProductAndOfferService", productAndOfferService),
entry("EquipmentService", equipmentService),
entry("EvergentService", evergentService),
entry("FraudCheckService", fraudCheckService)
).
collect(entriesToMap()));
再次,爲什麼這裏需要的類型提示,而不是在其他應用程序?唯一的區別是另一個應用程序正在從一個函數返回地圖,新代碼將地圖分配給一個局部變量。我也修改了它,以便不將它存儲到局部變量中,而是將它傳遞給另一種方法(這是最初的需要)。這並沒有改變添加類型提示的需要。
要麼將流首先分配給變量,要麼添加類型提示。或者,在Java 9中,使用'Map.of'。 –
檢查我的答案在愚蠢(我不相信是一個愚蠢的,將重新從實際的計算機)。這裏有一個Javac標誌,它將打開類型推斷算法的擴展調試信息。這可能會提供有關差異的線索。 –
任何想法如何讓Eclipse使用該標誌? –