Java

2011-08-19 21 views
7

Arabirimlerindeki bir listeye beton türlerinin bir listesini yayınlama Java'daki arabirimlerinin bir listesine beton türlerinin bir listesini yayınlamanın bir yolu var mı?Java

Örneğin

: önceden

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? 
    } 

} 

sayesinde

Caps

cevap

11

Baz listeleri olarak kullanılmak üzere generic wildcards kullanımı türetilmiş listeleri için izin yapabilirsiniz:

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

İade edilen listesinin bulunamadığını unutmayın. boş olmayan öğeler'a eklendi. (Bay Sauer'in belirttiği gibi, null'u ekleyebilir ve silme işlemi de iyi olabilir.) Bu durum, sizin durumunuzda önemli değil, umarım budur.

getShapes() bir geçersiz kılma olduğundan, dönüş türünü Repository'da da güncellemeniz gerekir.

+1

işe yarayabilecek "* yazılı edilemez *" değil * doğru tamamen *: Eğer hala 'null' ekleyebilir ve öğeleri kaldırabilir. –

+0

Teşekkürler. Bunu yansıtmak için güncellendi. – dlev

+0

Ya benim durumumda "bu" önemliyse? – osrl

3

Repository arabiriminin denetimindeyseniz, bunun yerine List<? extends Shape> türünde bir şey döndürmek için bunu yeniden yönlendirmenizi öneririm.

Bu ince derler:

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

Eğer gerçekten böyle bu şey yapmak istiyorsanız aşağıda

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

Bunun gibi. "? Uzatır" ile uğraşmaktan çok daha temiz – yurgis

+0

Bunun bir listesini oluşturduğuna dikkat edin. Uzun listeler ve/veya zaman kritik uygulamalar için uygun olabilir. –