2012-01-30 18 views
8

Tại sao Map<String, ?> test = ImmutableMap.builder().build(); không biên dịch được, nhưng Map<String, ?> test = ImmutableMap.<String, Object>builder().build(); hoạt động tốt?Tại sao không ImmutableMap.builder(). Build() chọn các tham số kiểu đúng?

Mã sniplet đầu tiên không thành công với:

error: incompatible types 
    Map<String, ?> test = ImmutableMap.builder().build(); 
               ^
    required: Map<String,?> 
    found: ImmutableMap<Object,Object> 

Tôi tin rằng committers Ổi có nghĩa là để làm việc này.

Trả lời

16

Đây không phải là một thất bại trong ổi, mà đúng hơn là cách Java giải quyết các generics, và đó là điều chúng ta không thể kiểm soát. = (

Believe chúng tôi:. Đây là điều mà chúng tôi đã dành rất nhiều thời gian trên Trong issue này, Kevin nói rằng chúng tôi đã cố gắng không ít hơn mười lăm cách tiếp cận đối với cố gắng để có được nó để bạn không phải xác định rõ ràng các thông số loại này

Nếu bạn chỉ quan tâm đến trường hợp ImmutableMap.builder().build(), tức là không có mục nhập nào trên bản đồ ... thì bạn nên sử dụng ImmutableMap.of(). generics: nó sẽ chỉ hoạt động

+0

Đây có phải là thứ có thể sửa trong ngôn ngữ không? Có nghĩa là chúng ta có thể gửi báo cáo lỗi với Oracle? – Gili

+0

Không ... có khả năng, tôi sợ. Nếu họ không đưa nó vào suy luận kiểu tăng cường với toán tử kim cương trong Java 7, tôi nghi ngờ rằng chúng có thể bao gồm nó. Có lẽ một số trường hợp cạnh kỳ lạ sẽ không thể quản lý vì lý do nào đó, nhưng tôi không chắc chắn về các chi tiết cụ thể. –

+0

@Gili: Tôi biết có một số công việc đang diễn ra để cải thiện suy luận kiểu cho Java 8 ... _may_ này là một cái gì đó có thể được suy ra với các quy tắc được cải thiện, tôi không chắc chắn. – ColinD

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