Tôi nghĩ rằng điều này có thể liên quan đến Why does a generic cast of a List<? extends Set..> to List<Set..> succeed on Sun JDK 6 but fail to compile on Oracle JDK 7?Loại suy luận hạn chế hơn trong JDK 7 so với JDK 6?
Nếu chúng ta lấy các lớp sau, họ biên dịch tốt dưới JDK 6:
public final class Foo<V> {
private final V value;
private Foo(final V value) {
this.value = value;
}
public static <T, R extends T> Foo<T> of(final R value) {
return new Foo<T>(value);
}
}
final class Tester {
@Test(groups="unit")
public static void test() {
bar(Foo.of(BigDecimal.ZERO)); // This line fails in JDK 7 but not JDK 6
}
private static void bar(final Foo<? extends Number> target) {
assert target != null;
}
}
Tuy nhiên, theo JDK 7, tôi nhận được lỗi sau:
[ERROR] \work\fsb-core\src\test\java\com\fsb\core\Foo.java:[42,8] error:
method bar in class Tester cannot be applied to given types;
Tôi nghĩ suy luận kiểu ít hạn chế hơn (ví dụ, thêm suy đoán hàm tạo) trong JDK 7. Tuy nhiên, ở đây, trình biên dịch đang từ chối một loại có giá trị theo JDK 6.
Đây có phải là lỗi không? Hoặc là các quy tắc về suy luận được thực hiện nghiêm ngặt hơn cho các phương pháp?
Java 8 (1.8.0_25) điều này biên dịch lại tốt. – Lii