Tại sao Java có thể suy ra tổ tiên chung của nhiều loại giới hạn trên, nhưng không phải là loại giới hạn dưới?Suy luận kiểu Java với các loại giới hạn dưới
Cụ thể hơn, hãy xem xét các ví dụ sau:
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);
}
}
Thử nghiệm của bạn biên dịch cho tôi mà không có đối số loại rõ ràng bằng cách sử dụng 1.8.0_25. – Alex
@Alex Tôi đang sử dụng 1.7. Có lẽ nó đã được sửa. – shmosel