2015-06-16 11 views
5

rozważyć tę klasę Java:Jak skopiować rodzajowe kolekcji w Javie przy użyciu symboli wieloznacznych

import java.util.Collection; 
import java.util.Iterator; 
import java.util.LinkedList; 


public class NumberSet { 

    private Collection<? extends Number> numbers; 

    public NumberSet(Collection<? extends Number> numbers) { 
     this.numbers = numbers; 
    } 

    public NumberSet(NumberSet other) { 

     //copy other.numbers to this.numbers 
     numbers = new LinkedList<>(); 
     for (Iterator<? extends Number> it = other.numbers.iterator(); it.hasNext();) { 
      numbers.add(it.next()); // Here's Syntax Error near `it.next()` 
     } 

    } 
} 

nie jest to błąd składni wewnątrz for pętli:

actual argument Number cannot be converted to CAP#1 by method invocation conversion 
where E is a type-variable: 
    E extends Object declared in interface Collection 
where CAP#1 is a fresh type-variable: 
    CAP#1 extends Number from capture of ? extends Number 

Rozumiem sens PECS ale I chcesz zaimplementować konstruktora kopii dla tej klasy. skopiowana instancja byłaby używana tak jak migawka z other. dowolny pomysł?

+1

@BrianAgnew I naprawdę nie rozumiem, jak można oznaczyć pytanie jako duplikat 'Co jest PECS'? Gdyby ktoś znał termin "PECS", w pierwszej kolejności nie zadałby pytania. – CKing

+1

Ponownie otworzyłem go, ponieważ zgadzam się z tobą. Myślę, że pytanie/odpowiedź PECS rozwiązuje ten problem, ale całkowicie podjąłem decyzję: –

+1

@BrianAgnew Dziękuję za ponowne otwarcie pytania. Edytuję tytuł, aby był bardziej dostępny. – CKing

Odpowiedz

5

Zmiana:

Collection<? extends Number> dst 

Do:

Collection<? super Number> dst 

dodatku nie jest dozwolone przy użyciu ? extends. Istnieje coś takiego jak zasada Get i Put. Cytując z książki Generics and Collections z Philip Wadler:

Get i Put Zasada: użyć rozciąga wieloznaczny kiedy można dostać tylko wartości z konstrukcji, należy użyć super wieloznaczny, gdy tylko umieścić wartości do struktury i nie używać symboli wieloznacznych, gdy zarówno dostać i umieścić

wziąć również spojrzeć na PECS bardziej wspólnego wyjaśnienia tego zjawiska. (Jednakże, wolę zasadę GET i PUT nad zasadą Producer i Consumer ponieważ jest mniej kłopotliwe)

+0

Zobacz także mnemonik PECS na http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs. –

+0

@ChetanKinger - skąd wziął się powyższy cytat? Czy możesz podać link lub referencję? –

+0

@BrianAgnew Dodano link do książki. – CKing

Powiązane problemy