2010-06-20 36 views
8

Tôi đã có một số mã phân tích đối số dòng lệnh cũ tôi đã viết 4 năm trước cho Java 5, và nó sẽ không biên dịch trong Java 6 nhờ những thay đổi về cách xử lý generics và/hoặc các lớp thư viện nhất định. Trong khi cố gắng khắc phục nó, tôi đã gặp phải vấn đề sau; vì đã 4 năm kể từ khi tôi chạm vào Java và tôi chưa bao giờ là một chuyên gia về Generics để bắt đầu, nó khiến tôi bối rối.Không thể cụ thể với các kiểu trường chung Java như với các kiểu phương thức chung?

Thư viện cho phép tôi chỉ định các tùy chọn dòng lệnh nhất định tương ứng với enums. Để làm điều này, đối tượng ArgumentSpecification tương ứng với tùy chọn này muốn giữ một đối tượng Class, mà chúng ta sẽ gọi là "enumClass", tương ứng với lớp enum. Thật không may, tôi dường như không thể tìm ra cách viết đúng kiểu trường đó để hạn chế nó để chứa các đối tượng lớp tương ứng với các lớp Enum thực tế. Tôi nghĩ rằng những gì tôi muốn là một cái gì đó như:

protected <E extends Enum<E>> Class<E> enumClass; // compiler error 

nhưng trình biên dịch barfs về điều này. Mặt khác, trình biên dịch là hoàn toàn hài lòng với phương pháp có giá trị lợi nhuận và/hoặc các thông số quy định như vậy:

protected <E extends Enum<E>> Class<E> dummyTest(Class<E> foo) { return foo; } // "works" 

tôi có thể thử sử dụng này cho trường thay vì:

protected Class<? extends Enum<?>> enumClass; 

nhưng điều đó không thực sự làm việc ... các phần khác của mã cần kiểu "<E extends Enum<E>>"" để chúng có thể thực sự nhận được E, và điều này dường như không khớp với "<? extends Enum<?>>", vì tôi nhận được lỗi biên dịch như sau:

Bound mismatch: The generic method checkedEnumFromString(Class<E>, String) of type EnumUtil is not applicable for the arguments 
(Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded 
parameter <E extends Enum<E>> 

Có cách nào để khai báo trường với đúng loại ở đây mà tôi bị thiếu không? Nếu vậy, nó là cái gì? Nếu không, nó không phải là khủng khiếp bị phá vỡ của Java để có thể khai báo các loại trong các phương pháp mà bạn không thể cho các lĩnh vực? Hay tôi quá bối rối đến nỗi câu hỏi của tôi không có ý nghĩa gì khi bắt đầu?

Trả lời

9

Nếu bạn cần phải xác định một lĩnh vực với tham số rõ ràng E như vậy, sau đó bạn có thể phải parameterize loại, trong đó lĩnh vực này được khai báo trong Something như thế này biên dịch:.

class MyClass<E extends Enum<E>> { 
    Class<E> enumClass; 
} 
+2

Tôi sợ điều đó ... ugh. Tôi nghĩ rằng nó thực sự là ít kludgy trong trường hợp của tôi để chỉ chấp nhận rằng hệ thống kiểu Java là chậm (nhờ, loại tẩy xoá!) Và sử dụng "Class enumClass;" kết hợp với một @PutTheHellUp tự do ("bỏ chọn"); Cảm ơn bạn đã phản hồi. –

7

Bạn đang cố gắng để khai báo "trường chung" - một trường có tham số kiểu. Không có khái niệm như vậy trong Java - chỉ có các phương thức và loại có thể đưa vào các tham số kiểu.

Như polygenelubricants nói, bạn có thể giới thiệu một tham số kiểu bổ sung trong chính loại đó và sử dụng nó làm loại trường.

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