Java-Typinferenz: Referenz ist in Java 8 nicht eindeutig, aber nicht in Java 7
Sagen wir, wir haben 2 Klassen. Eine leere KlasseBase
und eine Unterklasse dieser KlasseDerived
.
public class Base {}
public class Derived extends Base {}
Dann haben wir ein paar Methoden in einer anderen Klasse:
import java.util.Collection
public class Consumer {
public void test() {
set(new Derived(), new Consumer().get());
}
public <T extends Base> T get() {
return (T) new Derived();
}
public void set(Base i, Derived b) {
System.out.println("base");
}
public void set(Derived d, Collection<? extends Consumer> o) {
System.out.println("object");
}
}
Dies wird in Java 7 kompiliert und erfolgreich ausgeführt, in Java 8 jedoch nicht. Der Fehler:
Error:(8, 9) java: reference to set is ambiguous
both method set(Base,Derived) in Consumer and
method set(Derived,java.util.Collection) in Consumer match
Warum funktioniert Java 7, aber nicht Java 8? Wie könnte<T extends Base>
j Spielesammlung?