2011-06-23 49 views
14

Tôi đang cố tạo một thiết lập trong đó một nhóm các lớp con ghi đè lên một siêu lớp. cha này chứa một phương pháp trừu tượng - các kiểu trả về trong số đó sẽ lý tưởng là của các đối tượng từ đó phương pháp này được gọi là, như vậy mà nó có hiệu quả hoạt động như sau:Generics Java - ghi đè một phương thức trừu tượng và có kiểu trả về của lớp con

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

Tôi không chắc chắn nếu một điều như vậy là có thể , như tôi nghĩ rằng các loại trả về luôn phải giống nhau để cho việc ghi đè hoạt động - tuy nhiên tôi đã nghĩ ra câu trả lời, nên một câu trả lời nằm ở đâu đó dọc theo dòng này ...

public abstract class SuperClass{ 
    public abstract <? extends SuperClass> getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

Xin cảm ơn Cứu giúp.

chỉnh sửa: thêm kéo dài SuperClass để lớp con, duh

+0

Tôi không biết bạn sẽ sử dụng điều này như thế nào. Ông có thể cho tôi một ví dụ? –

Trả lời

7

này sẽ làm việc:

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

Thông báo Tôi đã thêm extends SuperClass định nghĩa SubClass của bạn. Kiểu trả về của getSelf được gọi là covariant return type.

+0

Ahh, tất nhiên tôi quên thêm siêu mở rộng trong ví dụ mặc dù chắc chắn tồn tại trong mã của tôi ... Điều đó nói rằng, tôi hoàn toàn không biết rằng điều này đã làm việc, cảm ơn! – Numeron

+1

Điều này không hiệu quả đối với tôi: ( – Carlos

4

Làm thế nào về điều này:

public abstract class SuperClass<T extends SuperClass<?>> { 
    public abstract T getSelf(); 
} 

public class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { 
     return this; 
    } 
} 

Tôi biết nó khá lặp đi lặp lại và không có gì tiếp giáp với loại để được giống SubClass dụ, bởi vì cũng AnotherSubClass sẽ đáp ứng các ràng buộc, nhưng ít nhất nó nên làm các trick.

2

Đây là cách thực hiện (Vì JDK 1.5 có thứ gọi là kiểu trả về biến đổi, ở đây có thể có thứ như thế này).

abstract class SuperClass<T extends SuperClass<T>>{ 
    public abstract T getSelf(); 
} 

class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { return this; } 
} 

public class Generics { 
    public static void main(String[] args) { 
    System.out.println(new SubClass().getSelf()); 
    } 
} 

Thông báo một lớp học tương tự như định nghĩa chung với Enum (http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)

Xem gì xảy ra đằng sau hậu trường (bằng cách sử dụng javap SuperClass lớp con):

class SubClass extends SuperClass{ 
    SubClass(); 
    public SubClass getSelf(); 
    public SuperClass getSelf(); 
} 

abstract class SuperClass extends java.lang.Object{ 
    SuperClass(); 
    public abstract SuperClass getSelf(); 
} 

Thông báo như thế nào phương pháp lớp con có một kiểu trả về khác nhau, đó là một subtype của siêu loại phương thức hoàn trả.

Btw, lưu ý rằng public SuperClass getSelf(); trong lớp SubClass thực sự là phương pháp tổng hợp.

+0

kết quả !!!!!! +1 –

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