2015-08-14 17 views
8

:Java jenerik alan beyanı

public class Client { 
    private Map<Class<T extends Serializable>, List<Consumer<S extends T>>> classToConsumerTry1; 

    private <T extends Serializable, S extends T> Map<Class<T>, List<Consumer<S>>> classToConsumerTry2; 
} 

promblem java derleyicisi bana izin vermiyor :)

Yani olduğunu Benim sorum, sınıf istemcime tür eklemeden nasıl doğru bir şekilde T ve S'yi tanıtacağım.

Amacım ClassSerializable bir alt tipi ve Class için seçtiği sınıfın bir alt tipi olan Consumer olmanın zorlamak etmektir.

+0

Neden uzatmak istemiyorum sınıf beyannameniz? – Smutje

+0

Çünkü "Harita", yalnızca "İstemci" beyanında tanımlananlar değil, T ve S için farklı değerler içerebilmelidir. – succcubbus

+0

Harita üyeleriniz nerede başlatıldı? Bir kurucuda? Bazı belirleyici yöntemde? – Eran

cevap

7

Yapamazsınız. Tek seçeneğiniz, Client sınıf bildiriminde genel tip parametrelerini bildirmektir. Client sınıfınızın jenerik tip parametreleri yoksa, üyeleri genel olamaz. Sınıf üyelerinizin beyanında gerçek tipleri kullanmalısınız.

4

Tip-parametresini tanıtmak için bir yere sahip olmalısınız, böylece bunları sınıf üyelerinizin tanımında kullanabilirsiniz.

Bir tip parametresi tanıtımı, yalnızca sınıf düzeyinde veya yöntem düzeyinde yapılabilir. Senin durumunda, bu sınıf düzeyinde olmalıdır:

public class Client<T extends Serializable, S extends T> { 
    private Map<Class<T>, List<Consumer<S>>> classToConsumerTry1; 

    private Map<Class<T>, List<Consumer<S>>> classToConsumerTry2; 
} 

Ancak bu, her iki üye (classToConsumerTry1 ve classToConsumerTry2) için, T ve S aynı olduğunu ima eder. Farklı olmalarını istiyorsanız, bu iki değeri iki farklı sınıftan almanız gerekir, bunların her ikisi de ayrı tip parametreleriyle parametrelenir.

4

doğrudan sahada bunu yapamaz, ancak genel yöntemlerle sizin tipleri politikasını (hatta olmayan jenerik sınıfta bulunabilir) koruyabilirsiniz:

@SuppressWarnings("rawtypes") 
private Map<Class, List> map; 

public <T extends Serializable> void put(Class<T> key, List<Consumer<? extends T>> value) { 
    map.put(key, value); 
} 

@SuppressWarnings("unchecked") 
public <T extends Serializable> List<Consumer<? extends T>> get(Class<T> key) { 
    return map.get(key); 
}