2015-08-25 12 views
7

iki arabirimleri kullanın:Jenerik Kaos Java

public interface Receiver<T> { 

    public void receive(T obj); 

    public Set<Class<? extends T>> getInterests(); 

} 

public interface Distributor<T> extends Receiver<T> { 

public void register(Receiver<T> receiver); 

} 

Ben mesela bir Distribütör bir Dağıtıcı kaydetmek istediğiniz Sorunum Distributor<Object> == kayıt ==>Distributor<String>

ilk düşüncem register(Receiver<? extends T> receiver). için kayıt yöntemini değiştirmek oldu Ama Sınıfları almak istiyorsanız alıcı Set<Class<? extends ? extends T>> gibi bir şey dönecekti Yöntem getInterests intrested olduğunu. Dolaylı ben Set<Class<? extends T>> gibi bir şey olsun ama transitiv joker Java mümkün olmadığını yaşadı.

bir fikir kimseyi mi var?

DÜZENLEME: Örnek olarak:

public void register(Receiver<? extends T> receiver){ 
    Set<Class<? extends T>> interests = receiver.getInterests(); 
    //Problem because receiver.getInterests is 
    //Set<Class<? extends ? extends T>> 
    ... 
} 
+2

sizin için derleme değil bir kod satırının bir örnek verebilir ... joker

public Set<? extends Class<? extends T>> getInterests(); 

kullanılması gerektiğini ama ben çok fazla kahrolası joker var biliyor? Kod derlenecek gibi görünüyor. –

cevap

7

Senin sorunun ? extends veya ? super joker kullanarak onları varyantını yapmak sürece Java jenerik tamamen değişmez olmasıdır.

A Set<Class<? extends T>> sadece tam olarak derleme zamanı tip Class<? extends T> ifadelerini tutabilir. Class<String> (bu tip dönüştürülebilen bile) Class<? extends T> aynı türde değildir.

Sen Class<? extends T> dönüştürülebilen her türlü tutabilecek bir seti istiyorum. olacağını

bir Set<? extends Class<? extends T>>

+1

'Class' final değil mi? Sınıfı genişleten bir şey nasıl olabilir? – Codebender

+2

@Codebender: 'extends' aslında" dönüştürülebilir "anlamına gelir. 'Class ', 'Class <'a dönüştürülebilir mi? Object> '('' sınıfına göre değil; _both_'? extends' joker karakterlerine ihtiyacınız var). – SLaks

+1

@Codebender 'Sınıf ' sınıfı son ve sınıflandırma edilemez halde jenerik aracılığıyla alt türlerini sahip olabilir. 'extends' bir sınırda kullanıldığında daha geniş bir anlama sahiptir. – Radiodef

1

Sen

public Set<Class<? extends T>> getInterests(); 

muhtemelen amaçlanan bir yardımcı yerine Öte yandan joker

public void register(Receiver<? extends T> receiver) 
{ 
    register2(receiver); 
} 

private <S extends T> void register2(Receiver<S> receiver) 
{ 
    Set<Class<? extends S>> interests = receiver.getInterests(); 
    ... 
} 

bir tür değişkeni kullanır yöntemi, yöntem ekleyebilirsiniz Bir covariant Set döndürmek veya salt okunur ayarlamak için. İdeal