Error using Java generics: “parametro di tipo S non è entro il suo limite”

Sto scrivendo alcune classi, utilizzando i Generici, ma non riesco a trovare una soluzione
per la classe SolutionsSubset e così ho sempre l’errore
“parametro di tipo S non è entro il suo limite”. Ho letto i precedenti
domande circa lo stesso errore, ma non riesco a risolvere per il mio caso.
Potrebbe qualcuno aiutarmi a migliorare le mie conoscenze circa i generici? Qualsiasi
di riferimento per un buon libro (che posso trovare in google un sacco di informazioni
ma se qualcuno può raccomandare un libro, tutorial, etc. sarà il benvenuto).
Anche se ho cercato di tenere a mente le regole per porre una domanda, ma ho
scusa se la mia domanda non rispetta queste regole.

Ho le seguenti classi e interfacce:



public interface Subset<T extends Comparable<T>> extends Comparable<Subset<T>>
public class MathSubset<T extends Comparable<T>> extends TreeSet<T> implements Subset<T>

public interface Solution<T extends Comparable<T>>

public interface Solutions<S extends Solution<?>> extends Iterable<S>
public class SolutionsSubset<S extends Solution<?>> extends MathSubset<S> implements Solutions<S>

 

Ho bisogno di quel Sottoinsieme si estende Comparabili. In SolutionsSubset, la classe MathSubset negozi di oggetti della Soluzione. Come devo modificare queste definizione per farlo funzionare?

Grazie in anticipo

OriginaleL’autore user539694 | 2010-12-12

3 Replies
  1. 6

    Per essere utilizzato come argomento di tipo in MathSubset, SolutionsSubsets S deve extend Comparable<S>. Come compilabile esempio:

    import java.util.TreeSet;
    
    interface Subset<T extends Comparable<T>>
         extends Comparable<Subset<T>> { }
    
    class MathSubset<T extends Comparable<T>>
        extends TreeSet<T>
        implements Subset<T>
    {
        public int compareTo(Subset<T> other) { throw new Error(); }
    }
    
    interface Solution<T extends Comparable<T>> { }
    
    interface Solutions<S extends Solution<?>> extends Iterable<S> { }
    
    class SolutionsSubset<S extends Solution<?> & Comparable<S>>
        extends MathSubset<S>
        implements Solutions<S>
    { }

    Un paio di commenti: Questo è molto astratto esempio, e quindi non è facile pensare. Recante il codice in modo che non hai bisogno di scorrimento è buona. C’è un sacco di eredità che sta succedendo qui, forse, comporre, piuttosto che, diciamo, si estende TreeSet. È difficile distinguere tra gli identificatori Solutions e Solution.

    Grazie. La tua soluzione è interessante, anche se ho finalmente cambia il design per renderlo più semplice.

    OriginaleL’autore Tom Hawtin – tackline

  2. 2

    Generici sono qualcosa che possono ottenere rapidamente fuori di mano, soprattutto se si tenta di “essere tutto generico” tutto in una volta. Meno è di più. Quello che sempre mi aiuta è quello di avviare concrete (tra cui l’attuazione) e poi, lentamente, sostituire parametri generici, un parametro e classe alla volta.

    Potrebbe qualcuno aiutarmi a migliorare le mie conoscenze circa i generici?

    http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

    Non è un tutorial, ma un sacco di informazioni utili. Il suo uno di quei riferimenti che leggere le parti che si può capire, ma tornare a più e più volte in futuro come acquisire più padronanza di più comincia ad avere un senso.

    Vi ringrazio molto. Si tratta di una buona web in Java e Generici.

    OriginaleL’autore Bert F

  3. 1

    Prima di tutto, qui è l’errore completo (che è specifico per MathSubset di non ottenere un adeguato parametro): Bound mismatch: The type S is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type QifFixer.MathSubset<T>

    Il problema è che MathSubset si aspetta un <T extends Comparable<T>, ma si sta dando un S extends Solution<?> – quei tipi non avendo nulla a che fare con l’altro, perché una Soluzione non ereditare o implementare Comparable<T>.

    Se non altro, si potrebbe provare questo:

    public class SolutionsSubset<S extends Comparable<S>> extends
        MathSubset<S> implements Solutions<Solution<S>>;

    Purtroppo, questo ANCORA non funziona, perché MathSubset implementa Iterable, ma così non Soluzioni.

    Una soluzione semplice sarebbe di Soluzioni per non estendere Iterable, ma davvero mi sembra che si sta tentando di utilizzare un approccio complesso che è necessario. Potrebbe essere un “ha” invece di “è-un” progetto potrebbe essere più utile qui?

    Grazie per il tuo aiuto, ho finalmente deciso di passare ad una “è-un” design. Comunque, la tua soluzione mi ha aiutato a capire meglio Generics in Java

    OriginaleL’autore EboMike

Lascia un commento