我正在將Java7代碼移植到Java8,並提出了以下問題。 在我的代碼庫,我有兩個方法:對通用方法的Java 8調用不明確
public static <T> ImmutableSet<T> append(Set<T> set, T elem) {
return ImmutableSet.<T>builder().addAll(set).add(elem).build();
}
public static <T> ImmutableSet<T> append(Set<T> set, Set<T> elemSet) {
ImmutableSet.Builder<T> newSet = ImmutableSet.builder();
return newSet.addAll(set).addAll(elemSet).build();
編譯器返回不明的匹配誤差方法在下面的測試追加:
@Test(expected = NullPointerException.class)
public void shouldAppendThrowNullPointerForNullSecondSet() {
ImmutableSet<Integer> obj = null;
CollectionUtils.append(ImmutableSet.of(1), obj);
}
編譯器錯誤:
reference to append is ambiguous both method append(java.util.Set,T) in CollectionUtils and method append(java.util.Set,java.util.Set) in CollectionUtils match
如何重寫這些函數與從Java8引入的類型推斷一起工作?
你可以通過讓'ImmutableSet obj = null; \t \t ImmutableSet set = ImmutableSet.of(1); \t append(set,obj);'。 –
Tunaki
無法在ideone中重現(使用HashSet而不是ImmutableSet,但從類型推斷的角度來看這應該不重要)http://ideone.com/oT6SbF。 –
@AndyTurner無法使用jdk 1.8.0_51(和Eclipse Mars.2)進行編譯。 – Tunaki