2013-08-09 27 views
5

Tôi có một cái gì đó dọc theo dòng:"bất ngờ dấu hiệu" sử dụng ký tự đại diện thấp hơn giới hạn (Java)

interface Foo<T> { 
    //... lines [0,45]... 

/*line 46*/ <R, X super T&R> List<X> weave(R value); 
    //... 
} 

Nhưng IntelliJ được báo cáo:

  1. Lỗi: (46, 18) java: > dự kiến ​​
  2. Lỗi: (46, 19) java: bắt đầu bất hợp pháp của loại
  3. Lỗi: (46, 26) java: '(' dự kiến ​​
  4. Lỗi: (46, 28) java: < định danh> dự kiến ​​
  5. Lỗi: (46, 29) java: 'l' dự kiến ​​
  6. Lỗi: (46, 43) java: < định danh> dự kiến ​​

vấn đề là gì? Tôi không được phép ràng buộc tên với giới hạn dưới? Hay tôi chỉ được phép sử dụng biểu thức R&X ở giới hạn trên?

Thay đổi nó để

interface Foo<T> { 
    //... lines [0,45]... 

/*line 46*/ <R> List<? super T&R> weave(R value); 
    //... 
} 

mang

  1. Lỗi (46, 31) java:> dự kiến ​​
  2. Lỗi (46, 32) java: '(' dự kiến ​​
  3. Lỗi (46, 33) java: bắt đầu bất hợp pháp của loại
+0

@rgettman FYI câu trả lời của bạn là chính xác. Các downvoter và những người mà biện minh cho downvote đã nhầm lẫn wildcards với các thông số loại. "Bạn không thể khai báo biến kiểu siêu": http://stackoverflow.com/questions/2800369/bounding-generics-with-super-keyword ", bạn không thể khai báo hai giới hạn là các tham số kiểu chung chung" : http://stackoverflow.com/questions/13101991/java-generics-make-generic-to-extends-2-interfaces –

Trả lời

3

Bởi đọc đặc điểm kỹ thuật, super chỉ có thể được sử dụng với ký tự đại diện và không thể được ghi vào biến loại; xem JLS 4.5.1. Tương tự, & chỉ hợp lệ trong loại biến số, không nhập đối số và các biến loại không thể sử dụng super.

Sau khi nghĩ về nó, đây là lời giải thích của tôi: Lý do cho biến kiểu là loại bỏ việc truyền rõ ràng để cải thiện an toàn kiểu. Khi bạn khai báo thông số loại là super Foo, bạn đang nói rằng thông số đó là không hợp lệ là bất kỳ số nào là siêu lớp của Foo. Điều này có nghĩa là nó có thể là bất cứ thứ gì lên đến và bao gồm Object, và do đó bạn không có cách nào an toàn để đoán bất cứ điều gì về các đối tượng có kiểu thỏa mãn ràng buộc, và vì vậy không có thông tin nào chứa trong biến kiểu đã đặt tên; bạn chỉ cần ký tự đại diện và có thể gọi hashCode() hoặc toString(), nhưng không có gì cụ thể theo loại.

+0

Bạn có thể nghĩ ra bất kỳ cách nào để xác định ngữ nghĩa tôi đang cố gắng không? –

+0

Bạn có thể giải thích ngữ nghĩa? O :-) Không dễ để suy ra từ mã của bạn. 'Giao diện Foo' phải làm gì? Còn về 'weave' thì sao? Bạn đang định sử dụng 'super' trong kiểu trả về là gì? – chrylis

+0

Foo chỉ là một bộ sưu tập của T. "dệt" là một khái quát của mô hình một thường được sử dụng để in các yếu tố của một mảng: [1, 2, 3].dệt (",") sẽ trả về [1, ",", 2, ",", 3,]. Nói cách khác, nó trả về 'this', ngoại trừ tham số nối giữa mỗi phần tử. Đối với ngữ nghĩa của các generics, tôi muốn trả về một Danh sách các siêu kiểu có nguồn gốc phổ biến nhất cho R và T, mặc dù tôi không chắc cơ chế như vậy tồn tại. Tôi muốn làm điều này để danh sách trả về được tham số theo một cách nào đó (và không chỉ là một List thô) nếu có thể, cho an toàn kiểu. –