2016-11-09 3 views
1

Zum Beispiel, ich habe nächste Klasse, mit beschränkten Typ Parametern:Java-Methode mit niedriger beschränkten (Super-) Typ

public class ItemContainer<T> { 
    void addItems(List<T> items); 
} 

und Verwendung in einer anderen Klasse mit dem Parameter:

public class ItemsGenerator<T> { 
    public void putItems() { 
     ItemContainer<? super T> itemContainer = getItemContainer(); 
     List<? super T> items = getItems(); 
     itemContainer.addItems(items); // compilation error! 
    } 
} 

Von meinem Verständnis Das Problem ist, dass es unbekannt ist, ob der erste (ItemContainer) generische Parameter derselbe wie der zweite (List) ist oder nicht. Die gute Lösung generic untere Grenze Art der Methode definieren könnte:

public <S super T> void putItems() { 
    ItemContainer<S> itemContainer = getItemContainer(); 
    List<S> items = getItems(); 
    itemContainer.addItems(items); // ok 
} 

Aber überraschenderweise (wie bei mir), gibt es keine solche Syntax ( slightly unconvincing reason)!
Gibt es eine Möglichkeit, dieses Problem zu lösen? Ich bin sicher, dass (in meinem Fall) der erste und der zweite Parameter identisch sein würden, aber ich weiß nicht, wie ich Java erklären soll.

Antwort

1

Sie haben Recht, Java erlaubt dies nicht, weil zwei Instanzen, obwohl sie denselben Super haben, nicht von derselben Klasse sein können und daher Laufzeitausnahmen vermeiden. Da Sie sicher sind, dass sie immer derselben Klasse angehören, warum nicht denselben Typ in itemContainer und items verwenden?

+0

Da der generische Typ Parameter von itemContainer und Elemente sollte der Super-Typ von T (im Klassenheader definiert) sein. –

+0

@DenisDorohov: "der Super-Typ von T" Es gibt keine "der" Super-Typ von "T". '? Super T bedeutet, dass es ein beliebiger Typ sein kann, der ein Supertyp von "T" ist, einschließlich "T" selbst, "T" direkter Superklasse, der Superklasse dieser Klasse usw. (einschließlich aller implementierten Schnittstellen usw.) zu "Objekt". – newacct

Verwandte Themen