xem xét chương trình này:Tại sao chương trình này biên dịch với Java 7 chứ không phải Java 8?
public class xx<T> {
<T> Iterable<T> createIterable(Class<T> cls) {
return null;
}
Iterable<? extends Number> createNumberIterable(boolean floatingPoint) {
return this.createIterable(floatingPoint ? Integer.class : Float.class);
}
}
Dưới Java 7 nó biên dịch:
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
$ javac xx.java
$
Dưới Java 8 nó không:
$ java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
$ javac xx.java
xx.java:8: error: method createIterable in class xx<T#2> cannot be applied to given types;
return this.createIterable(floatingPoint ? Integer.class : Float.class);
^
required: Class<T#1>
found: floatingPo[...]class
reason: inferred type does not conform to equality constraint(s)
inferred: Float
equality constraints(s): Float,Integer
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>createIterable(Class<T#1>)
T#2 extends Object declared in class xx
1 error
$
Và đó là sự thật:
- Đây là lỗi trong Java 7 đã được sửa trong Java 8 (trình biên dịch quá dễ dãi); hoặc
- Đây là một lỗi mới đã được giới thiệu trong Java 8
Nếu câu trả lời là # 1, bạn có thể giải thích bằng ngôn ngữ bình thường lý do tại sao JLS không cho phép điều này, sử dụng các giải thích rõ ràng?
(Lưu ý: xin đừng giải thích làm thế nào để workaround vấn đề, đó không phải là câu hỏi)
Có vẻ như đây là câu trả lời ở đây: http://stackoverflow.com/a/23880278/1172714 – dsh
hãy thử cách giải quyết khác - 'createIterable (Lớp extends T>)' – ZhongYu