2015-09-03 34 views
5

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:

  1. Đâ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
  2. Đâ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)

+3

Có vẻ như đây là câu trả lời ở đây: http://stackoverflow.com/a/23880278/1172714 – dsh

+0

hãy thử cách giải quyết khác - 'createIterable (Lớp )' – ZhongYu

Trả lời

0

Cả là các hành vi cũ lỗi, cũng không phải là hành vi mới một lỗi. Các quy tắc cho loại biểu thức có điều kiện trở nên phức tạp hơn, giúp trong nhiều trường hợp và không thực sự gây tổn thương cho bạn.

Trình biên dịch không cho phép vì các loại Integer.classFloat.classkhông thể so sánh. Không có loại T sẽ làm cho Class<T> một siêu kiểu của cả hai số Class<Integer>Class<Float>.

Các vấn đề liên quan