Dlaczego Java może wnioskować o wspólnym przodku wielu typów o górnym ograniczeniu, ale nie o typach o dolnych ograniczeniach?Wnioskowanie typu Java o niższych ograniczonych typach
Dokładniej, należy rozważyć następujące przykłady:
static class Test {
static <T> T pick(T one, T two) {
return two;
}
static void testUpperBound() {
List<? extends Integer> extendsInteger = new ArrayList<>();
// List<? extends Integer> is treated as a subclass of List<? extends Number>
List<? extends Number> extendsNumber = extendsInteger;
// List<? extends Number> is inferred as the common superclass
extendsNumber = pick(extendsInteger, extendsNumber);
}
static void testLowerBound() {
List<? super Number> superNumber = new ArrayList<>();
// List<? super Number> is treated as a subclass of List<? super Integer>
List<? super Integer> superInteger = superNumber;
// The inferred common type should be List<? super Integer>,
// but instead we get a compile error:
superInteger = pick(superNumber, superInteger);
// It only compiles with an explicit type argument:
superInteger = Test.<List<? super Integer>>pick(superNumber, superInteger);
}
}
Twój test kompiluje się dla mnie bez jawnego argumentu typu przy użyciu 1.8.0_25. – Alex
@Alex Używam 1.7. Może zostało to naprawione. – shmosel