Почему Java может вывести общий предок из нескольких типов с верхним ограничением, но не из менее ограниченных типов?Вывод типа Java с нижними ограниченными типами
Более конкретно, рассмотрим следующие примеры:
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);
}
}
Ваш тест компилируется для меня без аргумента явного типа с использованием 1.8.0_25. – Alex
@Alex Я использую 1.7. Возможно, это так исправлено. – shmosel