2012-02-21 26 views
8

Nếu tôi có như sau:Generic phương pháp - "chuyển đổi không được kiểm soát để phù hợp với T từ loại" cảnh báo

public interface Foo { 
    <T extends Foo> T getBlah(); 
} 

public class Bar implements Foo { 
    public Bar getBlah() { 
     return this; 
    } 
} 

tôi nhận được một cảnh báo trong nhật thực về việc thực hiện 'getBlah' trong lớp Bar:

- Type safety: The return type Bar for getBlah from the type Bar needs unchecked conversion to conform to T from the type 
Foo 

Làm cách nào để khắc phục sự cố này? Và tại sao tôi nhận được cảnh báo?

Cảm ơn

+0

Bạn đã viết rằng kiểu trả về bởi 'getBlah' phải mở rộng giao diện' Foo'. Nhưng 'Bar' thì không, nó thực hiện nó. – vulkanino

+2

'mở rộng' bao gồm việc triển khai giao diện – Joeblackdev

+0

Một trường hợp quá chung chung. Xem bình luận của Joeblackdev và câu trả lời của Alessandro Santini. – Saintali

Trả lời

13

Bạn đang trọng một phương pháp từ giao diện của bạn, vì vậy thực hiện của bạn, bạn nên khớp với chữ ký từ đặc điểm kỹ thuật của bạn:

public class Bar { 
    @Override 
    public <T extends Foo> T getBlah() { 
     return this; 
    } 
} 

Bây giờ, nếu bạn đang thay vì lên kế hoạch vào việc tạo ra một override parametized đặc biệt của toàn bộ quá trình triển khai, khi đó bạn cần chỉ định loại chung làm một phần của định nghĩa giao diện:

public interface Foo<T extends Foo<T>> { 
    T getBlah(); 
} 

public class Bar implements Foo<Bar> { 
    @Override 
    public Bar getBlah() { 
     return this; 
    } 
} 
+0

Và tại sao, trong tên của Thiên Chúa, ông nên suy ra một loại chung chung không được sử dụng ở bất cứ đâu? –

+0

Tôi không cho rằng đây là toàn bộ mã của anh ấy. Bởi vì bạn biết những gì họ nói về giả định ... – Perception

+0

Dòng đầu tiên phải là 'giao diện công cộng Foo >' hoặc 'giao diện công cộng Foo >'. –

3

Tôi không chắc chắn những gì bạn muốn thực hiện ở đây nhưng tôi nghĩ rằng trở về Foo sẽ là OK:

interface Foo { 

    public Foo getBlah(); 

} 

vì bạn không sử dụng loại chung ở bất kỳ đâu trong tham số.

4
<T extends Foo> T getBlah(); 

có nghĩa là một người gọi có thể yêu cầu bất kỳ loại như T để được trả lại. Vì vậy, không có vấn đề gì lớp đối tượng là, tôi có thể yêu cầu một số ngẫu nhiên khác phân lớp của Foo của tôi lựa chọn để được trả lại. Giá trị duy nhất mà một phương thức như vậy có thể trả về là null (trừ khi nó không an toàn), có lẽ không phải là những gì bạn muốn.

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