2011-08-19 32 views
7

Có cách nào để đúc danh sách các loại cụ thể vào danh sách các giao diện của nó trong Java không?Đưa ra danh sách loại bê tông vào danh sách các giao diện của nó trong Java

Ví dụ:

public class Square implements Shape { ... } 

public SquareRepository implements Repository { 

    private List<Square> squares; 

    @Override 
    public List<Shape> getShapes() { 
    return squares; // how can I return this list of shapes properly cast? 
    } 

} 

Cảm ơn trước,

Caps

Trả lời

11

Bạn có thể tận dụng các generic wildcards để cho phép cho các danh sách có nguồn gốc được sử dụng như danh sách cơ sở:

public List<? extends Shape> getShapes() { ... } 

Lưu ý rằng danh sách trả lại không thể có các mục không được thêm vào nó. (Như ông Sauer chỉ ra, bạn có thể thêm null và xóa cũng được.) Đó là sự cân bằng, mặc dù hy vọng rằng sẽ không thành vấn đề trong trường hợp của bạn.

getShapes() là ghi đè, bạn cần phải cập nhật loại trả về trong số Repository.

+1

"* không thể được ghi vào *" không * hoàn toàn * chính xác: bạn vẫn có thể thêm 'null' và loại bỏ các phần tử. –

+0

Cảm ơn. Cập nhật để phản ánh điều đó. – dlev

+0

Nếu điều đó "quan trọng" trong trường hợp của tôi thì sao? – osrl

3

Nếu bạn kiểm soát giao diện Repository, tôi đề nghị bạn cấu trúc lại nó để trả về một cái gì đó thuộc loại List<? extends Shape> thay thế.

này biên dịch tốt:

interface Shape { } 

class Square implements Shape { } 

interface Repository { 
    List<? extends Shape> getShapes(); 
} 

class SquareRepository implements Repository { 
    private List<Square> squares; 

    @Override 
    public List<? extends Shape> getShapes() { 
     return squares; 
    } 
} 
4

Nếu bạn thực sự muốn làm điều gì đó này như dưới đây có thể làm việc

@Override 
public List<Shape> getShapes() { 
    return new ArrayList<Shape>(squares); 
} 
+0

Thích nó. Sạch hơn nhiều so với đối phó với "? Mở rộng" – yurgis

+0

Hãy nhận biết rằng điều này tạo ra một bản sao của danh sách, mặc dù. Có thể có liên quan cho các danh sách dài và/hoặc các ứng dụng quan trọng về thời gian. –

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