2013-08-01 65 views
7

Giả sử rằng chúng tôi có hai giao diện Java chung: Foo<T>Bar<T>, trong đó có thể có nhiều triển khai. Bây giờ, giả sử rằng chúng ta muốn lưu trữ một trong mỗi trong một lớp học duy nhất, cả hai bằng cách sử dụng cùng một giá trị T, nhưng giữ cho triển khai chính xác gõ:Java: Thiết lập mối tương quan giữa các tham số kiểu

public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> { 
    TFoo getFoo(); 
    TBar getBar(); 
} 

Ở trên, T được sử dụng cho mục đích duy nhất của việc thi hành đó TFooTBar 's lớp học sử dụng tham số cùng loại. Thêm tham số kiểu này để FooBar có vẻ dư thừa vì hai lý do:

  1. FooBar không thực sự quan tâm đến T ở tất cả.
  2. Ngay cả khi nó đã làm, T có thể được suy ra từ TFooTBar.

do đó câu hỏi của tôi là nếu có một cách để thực thi điều kiện như thế này mà không làm lộn xộn lên danh sách các tham số kiểu FooBar 's. Phải viết FooBar<String, StringFoo, StringBar> thay vì lý thuyết tương đương FooBar<StringFoo, StringBar> trông xấu xí với tôi.

+0

Là một lưu ý phụ, tôi rất muốn thấy chúng thêm cú pháp tương tự như 'giao diện công khai FooBar , TBar mở rộng thanh > {}' sang Java. – Smallhacker

+0

Tôi không nghĩ rằng điều này là có thể. Không phải với 'T' là chung chung. Great câu hỏi 1 –

+0

thể trùng lặp của [Redundant thông số chung chung] (http://stackoverflow.com/questions/9684186/redundant-generic-parameters) –

Trả lời

2

Thật không may, không có cách nào tốt hơn ... Trình biên dịch cần loại T được khai báo để sử dụng nó và không có nơi nào khác để khai báo nó:

EDIT: liên kết không liên quan

If bound A is not specified first, you get a compile-time error:

class D <T extends B & A & C> { /* ... */ } // compile-time error 

(extract from this doc)

Và đây là một chút ngoài chủ đề, nhưng this doc xác định các quy ước về tên thông số loại như là các chữ cái in hoa đơn. Lưu ý:

+1

Mặc dù tôi không tranh luận về vấn đề bạn đang thực hiện, tôi chỉ muốn chỉ ra hồ sơ rằng tài liệu được liên kết dường như không giải quyết bất kỳ điều gì tương tự như vậy. Ngoài ra, báo giá của bạn đang nói về thứ tự của các lớp và các giao diện trong giới hạn, không có hay không họ đã được công bố. – Smallhacker

+0

Bạn nói đúng, tài liệu được liên kết không chủ yếu dành riêng cho chủ đề, do đó có sự hiện diện của báo giá (được chỉnh sửa để làm cho nó rõ ràng hơn một chút). Và, vâng, trật tự được mentionned, nhưng sự khác biệt giữa 'không quy định first' và chỉ đơn giản là' không specified' là gì? – gtinon

+0

Điểm mà doc đang cố gắng vượt qua là các lớp phải được xác định trước các giao diện trong một câu lệnh mở rộng. Trích dẫn có vẻ có liên quan khi được đưa ra khỏi bối cảnh, nhưng trong bối cảnh nó không có gì để làm với chủ đề này. – Smallhacker