2012-04-24 35 views
8

tôi đã có mã này:phương pháp java trở về một thể hiện của lớp <T kéo dài somethng>

public <T extends Scrapper> Class<T> getScrapper() { 
    return MyScrapper.class; 
} 

MyScrapper là một lớp thực hiện giao diện Scrapper. Tại sao cái này không hoạt động? Tôi nhận được lỗi sau trong JDK7:

error: incompatible types 
required: Class<T> 
found: Class<MyScrapper> 
where T is a type-variable: 
T extends Scrapper declared in method <T>getScrapper() 

P.S. Tôi đã thực sự cố gắng tìm kiếm toàn bộ 30-40 phút.

Cập nhật: nếu tôi khai báo phương thức là public Class<? extends Scrapper> getScrapper() { hoạt động. nhưng tôi vẫn không hiểu tại sao bản khai gốc lại không biên dịch. có gì sai với nó?

+0

Điều gì sẽ xảy ra nếu bạn chỉ đặt thành ControlAltDel

+0

cách bạn đề xuất không nên hoạt động. nhưng tôi đã thử một thứ khác và nó hoạt động. Tôi đã cập nhật câu hỏi –

+0

Tôi đang cảm thấy mệt mỏi. Tôi có nghĩa là thay đổi chỉ để Scrapper (unparameterized) nhưng bạn đã nhận nó để làm việc bằng cách sử dụng một đối số lớp và nếu phù hợp với mục đích của bạn ngay trên – ControlAltDel

Trả lời

10

Với phương pháp chung như getScrapper(), người gọi gọi của phương pháp xác định đối số loại thực tế cho phương thức là (T trong trường hợp này). Người gọi có thể chọn bất kỳ loại phụ nào là ScrapperT và phương thức của bạn (luôn trả về MyScrapper.class) sẽ không trả về đúng lớp.

Với chữ ký của phương pháp này, người gọi của phương pháp này mong chờ để có thể làm điều này:

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper(); 

Thay đổi phương pháp để trở Class<? extends Scrapper> làm cho nó không còn là một phương pháp chung ... có không có thông số loại cho người gọi để đặt. Thay vào đó, chữ ký cho biết rằng phương thức trả về đối tượng lớp cho một số loại phụ không xác định của ScrapperMyScrapper.class không khớp với hóa đơn cho điều đó.

+0

Cảm ơn bạn :) có vẻ như tôi đã mệt mỏi và câm ngày hôm qua khi tôi hỏi câu hỏi này: D nên đã có Bản thân mình :) –

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