2013-05-17 37 views
8

Tôi nhận thấy mã sau hoạt động khi biên dịch trong nhật thực với java spec 1.7 nhưng không hoạt động với 1.6.Tại sao HashMap mới <> tạo ra lỗi trong JDK 1.6 nhưng không 1.7

HashMap<String, String> hashMap = new HashMap<>(); 

Tôi muốn giải thích nhưng cú pháp này và tại sao nó hoạt động cho 1.7.

+2

http: // stackoverflow.com/questions/16243541/arraylist-vs-arraylistinteger –

+0

Điểm của toán tử này là gì? –

+0

Nó dành cho suy luận kiểu, nhưng cũng đồng thời nói với trình biên dịch "này, đây không phải là kiểu thô". Bạn có thể xem câu trả lời của tôi trong bài đăng mà tôi đã liên kết tới. –

Trả lời

19

Các new HashMap<>() (gọi là cú pháp kim cương) không được cho phép trong JDK 1.6 đơn giản chỉ vì nó chỉ được giới thiệu trong Java SE 7.

Look cho Type Inference for Generic Instance Creation trong Highlights of Technology Changes in Java SE 7.

Tôi muốn giải thích nhưng cú pháp này và tại sao nó hoạt động cho 1.7.

Dưới đây là lời giải thích rằng (hơi thích nghi) từ Oracle itself:

Trình biên dịch từ bản phát hành trước khi Java SE 7 có thể suy ra các thông số loại thực tế của nhà xây dựng chung, tương tự như phương pháp chung. Tuy nhiên, trình biên dịch trong Java SE 7 có thể suy ra các tham số kiểu thực tế của lớp chung được khởi tạo nếu bạn sử dụng kim cương (<>). Hãy xem xét ví dụ sau, đó là hợp lệ cho Java SE 7 và sau đó:

class MyClass<X> { 
    <T> MyClass(T t) { 
    // ... 
    } 
} 

 

MyClass<Integer> myObject = new MyClass<>(""); 

Trong ví dụ này, trình biên dịch infers loại Integer cho các loại hình chính thức tham số, X, của lớp chung MyClass<X>. Nó infers loại String cho tham số kiểu chính thức, T, của hàm tạo của lớp chung này.

4

Bởi vì đó là sự tăng cường của JDK 1.7 (các nhà điều hành Kim Cương), trước khi bạn phải chỉ rõ các loại Generic trên lớp và về nhà xây dựng HashMap<String, String> hashMap = new HashMap<String, String>();

9

Trong Java SE 7, bạn có thể thay thế các loại tham số của các nhà xây dựng với một tập rỗng của các tham số kiểu (<>):

Map<String, List<String>> myMap = new HashMap<>(); 

trong Java SE 6 nó phải được thực hiện theo cách này:

0.123.
Map<String, List<String>> myMap = new HashMap<String, List<String>>(); 

More details...

1

Bạn không thể sử dụng cú pháp tương tự như bạn đã sử dụng trong JDK 1.7 Đối với JDK 1.6

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