2014-05-15 11 views
5

Tôi có một dự án Java 1.6 Android. Tôi có một mã bên thứ ba mà không biên dịch:Làm thế nào để sửa chữa toán tử '<>' không được phép cho cấp nguồn dưới 1,7 trong 1,6?

import org.springframework.http.HttpEntity; 
//... 
HttpHeaders requestHeaders = new HttpHeaders(); 
//... 
new HttpEntity<>(requestHeaders); 

Nó nói: '<>' điều hành không được phép cho cấp nguồn dưới 1,7

Tôi không muốn chuyển sang dự án của tôi để 1.7. Tôi đã thay đổi dòng đó thành

new HttpEntity<Object>(requestHeaders); 

và bây giờ nó biên dịch tốt.

Nhưng bản sửa lỗi của tôi có đúng không? Java 1.7 làm gì với các dấu ngoặc rỗng?

Cập nhật

Đó đối tượng mới được thông qua với chức năng chấp nhận HttpEntity<?> tranh cãi. Tôi hiểu ý tưởng của suy luận kiểu, nhưng tôi không hiểu những gì hiện 1.7 trình biên dịch suy ra từ dòng mã nhất định.

+0

http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html –

+0

đối tượng mới được chỉ định ở đâu? Biến đó được định nghĩa như thế nào? – sidgate

+0

@ZouZou Cảm ơn, bit tôi vẫn không hiểu những gì hiện 1.7 trình biên dịch suy ra từ dòng đó. – Nick

Trả lời

4

Khắc phục của bạn gần như chính xác và dù sao cũng không nguy hiểm.

Object là gốc của hệ thống phân cấp và <> có nghĩa là "để trình biên dịch suy ra loại", vì vậy bất kỳ loại nào được suy ra trong 1.7 sẽ là chuyên môn của Object.

Sau khi đã xem cập nhật của bạn: <?> thực sự có nghĩa là "ký tự đại diện" (see here), vì vậy Object là tốt.

8

Bạn đang thiếu phần đầu tiên của dòng đó, tôi chắc chắn HttpEntity không được tạo để chỉ vứt nó đi (kiểm tra loại tham chiếu được lưu vào).

Java < 1,7 đòi hỏi này:

SomeGenericClass<String> foo = new SomeGenericClass<String>();

Java 1.7 cho phép này là viết tắt:

SomeGenericClass<String> foo = new SomeGenericClass<>();

+0

Cảm ơn. Vui lòng xem câu hỏi được cập nhật. – Nick

1

sửa chữa của bạn là đúng. Nó sẽ là tốt hơn để sử dụng chính xác (chung) loại `HttpEntitiy.

Ý tưởng đằng sau toán tử <> chỉ để giảm độ dài ở những nơi trình biên dịch có thể suy ra loại chung từ mã ngầm.

Như đã được mô tả trong này post

Diamond điều hành giảm một số tính cách rườm rà của Java quanh Generics bằng cách có các loại tham số trình biên dịch suy luận cho nhà xây dựng lớp generic

Nhu cầu như vậy nhà điều hành đến từ sự rườm rà của việc khai báo các thể hiện kiểu generic mới. Trong các phiên bản Java trước 1.7 bạn phải xác định Generics theo cách này:

List<MyClass> myClassCollection = new List<MyClass>(); 

Rõ ràng là dự phòng khi trình biên dịch có thể dễ dàng hiểu được kiểu cần xây dựng đối tượng.

Một cải tiến tuyệt vời mà đi kèm với toán tử này là sự trở lại của một kiểu generic:

Trước java 1.7:

public List<MyClass> getMyClassCollection() { 
    if(some condition) { 
     return new ArrayList<MyClass>(); 
    } else { 
     return LinkedList<MyClass>(); 
    } 
} 

Sau java 1.7:

public List<MyClass> getMyClassCollection() { 
    if(some condition) { 
     return new ArrayList<>(); 
    } else { 
     return LinkedList<>(); 
    } 
} 

Điều này có vẻ không đáng kể, nhưng thực tế có thể có những luồng mà bạn có thể tiết lộ một số tuyên bố như vậy. Lợi thế rất lớn xuất hiện khi bạn muốn thay đổi mã của mình. Nếu bây giờ bạn thay đổi phương thức trả lại List<MyClassChild> (trong đó MyClassChild mở rộng MyClass), bạn chỉ cần thay đổi một địa điểm và không phải vài địa điểm.

2

Nhà khai thác kim cương chỉ được cho là giảm thiểu nỗ lực không cần thiết liên tục phải nhập chung trong một nhiệm vụ.

Thay vì

ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<MyClassWithThatStupidLongName>(); 

Bạn chỉ có thể sử dụng:

ArrayList<MyClassWithThatStupidLongName> list = new ArrayList<>(); 

Tuy nhiên điều này đã được giới thiệu trong Java 7, và như bạn có vẻ cần mã làm việc cho một phiên bản thấp hơn, bạn sẽ phải thêm tất cả những Generics đó trở lại, như trong danh sách đầu tiên của tôi.

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