Ich portiere Java7-Code zu Java8, und ich kam mit einem folgenden Problem. In meiner Code-Basis habe ich zwei Methoden:Java 8 Aufruf zur generischen Methode ist mehrdeutig
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();
Compiler geben Fehler für Verfahren über zweideutiges Spiel in folgendem Test anfügen:
@Test(expected = NullPointerException.class)
public void shouldAppendThrowNullPointerForNullSecondSet() {
ImmutableSet<Integer> obj = null;
CollectionUtils.append(ImmutableSet.of(1), obj);
}
Compiler-Fehler:
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
Wie diese Funktionen neu schreiben, um mit Typinferenz zu arbeiten, die mit Java8 eingeführt wurde?
Sie können es mit 'ImmutableSet obj = null; \t \t ImmutableSet set = ImmutableSet.of (1); \t append (set, obj); '. –
Tunaki
Kann nicht in ideone reproduzieren (mit HashSet anstelle von ImmutableSet, aber das sollte nicht von einer Art Inferenzperspektive wichtig sein) http://ideone.com/oT6SbF. –
@AndyTurner Es kann nicht mit jdk 1.8.0_51 (und Eclipse Mars.2) kompilieren. – Tunaki