2013-06-17 25 views
19
public interface MyInterface{ 
    public int myMethod(); 
} 


public class SuperClass { 
    public String myMethod(){ 
     return "Super Class"; 
    } 
} 

public class DerivedClass extends SuperClass implements MyInterface { 
    public String myMethod() {...} // this line doesn't compile 
    public int myMethod() {...}  // this is also unable to compile 
} 

Khi tôi cố gắng biên dịch DerivedClass nó mang lại cho tôi những lỗigiao diện và thừa kế: "kiểu trả về int không tương thích"

 
java: myMethod() in interfaceRnD.DerivedClass cannot override myMethod() in interfaceRnD.SuperClass 
    return type int is not compatible with java.lang.String 

Làm thế nào tôi nên giải quyết vấn đề này?

+2

bây giờ nó nghe có vẻ thú vị – Xinus

+0

Vậy là có thực sự điều gì sai với 'public String myMethod() {...} '? Từ sự hiểu biết của tôi, vấn đề duy nhất là dòng ngay sau đó. Tôi đã bỏ lỡ một cái gì đó? – Josay

Trả lời

21

Kết quả lỗi từ thực tế là cuộc gọi đến myMethod sẽ không rõ ràng - phương thức nào trong hai phương pháp nên được gọi? Từ JLS §8.4.2:

Đây là lỗi biên dịch khi khai báo hai phương pháp có chữ ký ghi đè tương đương trong một lớp.

Kiểu trả về của phương thức không phải là một phần của chữ ký, do đó bạn nhận được lỗi theo tuyên bố ở trên.

Giả sử bạn có thể không chỉ đơn giản là đổi tên các phương pháp xung đột, bạn không thể sử dụng thừa kế trong trường hợp này, và sẽ cần phải sử dụng một sự thay thế như composition:

class DerivedClass implements MyInterface { 

    private SuperClass sc; 

    public String myMethod1() { 
     return sc.myMethod(); 
    } 

    public int myMethod() { 
     return 0; 
    } 

} 
+5

+1 để đề xuất bố cục cho phần * cách *. –

+0

tôi có bạn arshajii ... cảm ơn rất nhiều cho giải pháp .. tôi nên thích thành phần .... cảm ơn rất nhiều agian ... –

+2

+1 để trích dẫn các đặc tả ngôn ngữ –

12

Bạn không thể có hai phương pháp với chữ ký giống nhau nhưng các kiểu trả về khác nhau.

Điều này là do trình biên dịch không thể biết bạn đang cố gắng gọi phương thức nào khi bạn thực hiện object.myMethod();.

1

Quá tải phương thức được phân biệt theo thông số của chúng. Ở đây myMethod() trong cả giao diện và siêu lớp có chữ ký tham số tương tự. Vì vậy, bạn không thể làm điều này.

1

Bạn không thể có 2 phương pháp có cùng chữ ký nhưng với các loại trả về riêng biệt. Nếu nó có thể là nó không thể được xác định mà phương pháp đã được gọi.

BTW tất cả các phương thức trong giao diện là publicabstract.

public interface MyInterface{ 
int myMethod(); 
} 

Những gì bạn có thể làm là có một giao diện với tham số đầu vào, điều này được gọi là overloading

dụ:

 public interface MyInterface{ 
     String myMethod(String param); 
     } 
     and in your class 

     public class DerivedClass extends SuperClass implements MyInterface{ 


     public String myMethod(){ ...} 
     public String myMethod(String param) {...} 
     } 
Các vấn đề liên quan