Generics Type - Classe che implementa Iterable

di il
5 risposte

Generics Type - Classe che implementa Iterable

Salve a tutti, sto svolgendo un esercizio che data una classe A, mi chiede di scrivere la classe B necessaria alla compilazione di entrambi.
Ai fini dell'esercizio non è rilevante il corpo delle funzioni, a meno che non ci sia una variabile di ritorno; cioè non mi interessa sapere cosa fanno in effetti le funzioni, ma è necessario solo che le classi compilino.
Sia A:
public class A extends B<Object> {
    private B<?> b;
    private String msg;
    public A() { //public B(){}
        b = new B<Object>(null); //public B(T t){}
        msg = B.<A>buildMessage(this); //public static String buildMessage(B x){return "ciao";}
        }
    public Set<? super Number> f(Set<Integer> set1, Set<String> set2) {
        for (Integer n: b) //b dev'essere o un array di T, o un sottotipo di Iterable<T> dove T è assegnabile a Integer
            if (b.check(set1, n))
                return b.process(set1, set2 , n);
        return b.process(set2, set1 , null);
        }
}
A questo punto devo scrivere la classe B.. come sto provando a fare.
In effetti sono esercizi sui generics type, ne ho già svolti diversi, ma in questo caso il mio problema sorge per il ciclo
[code] for (Integer n: b)
[/code]
Non riesco ad implementare la classe B in maniera tale che non mi dia errore, avevo provato definendo la classe B come
public class B<T extends Iterable<Object>> implements Iterable<Object>{
ma ovviamente non va bene perchè è sbagliato, come tutte le altre intestazioni che ho provato!!
Penso che il tipo di B debba estende Iterable<qualcosa>(Ma forse sarà proprio sbagliata questa convinzione?!) ... Insomma in base alle mie conoscenze non riesco proprio a venirne a capo!
Spero in un vostro aiuto....

5 Risposte

  • Re: Generics Type - Classe che implementa Iterable

    Mi spiace ma di chiaro .... c'è ben poco. Tra l'altro se definisci B così ovvero

    class B<T extends Iterable<Object>>

    vuol dire che il T è limitato solamente a qualunque cosa che è Iterable di Object (es. List<Object>).

    E quindi

    class A extends B<Object>

    NON ha senso (e non compila), perché Object NON è Iterable.
  • Re: Generics Type - Classe che implementa Iterable

    andbin ha scritto:


    Mi spiace ma di chiaro .... c'è ben poco. Tra l'altro se definisci B così ovvero

    class B<T extends Iterable<Object>>

    vuol dire che il T è limitato solamente a qualunque cosa che è Iterable di Object (es. List<Object>).

    E quindi

    class A extends B<Object>

    NON ha senso (e non compila), perché Object NON è Iterable.
    Esatto!!
    E il mio problema è appunto che non riesco ad implementare la classe B in maniera tale che compili A.
    Nella classe A(che dev'essere così) ci sono dei commenti che ho aggiunto io in riferimento a cosa dev'esserci nella classe B affinchè quel riga compili.
    Il problema resta appunto come implementare B, in modo tale che quel ciclo di A, e A stesso sia ok? Non riesco proprio ad arrivarci
  • Re: Generics Type - Classe che implementa Iterable

    Ci sono comunque cose che "non tornano".

    Se A è così e basta, ci sono cose con poco senso. La istanziazione di B è fatta con

    new B<Object>( ....... )

    Questo vuol dire che B deve dichiarare per forza una type variabile (T, E ... chiamala come vuoi) che però non può essere bounded (limitata con extends) perché di fatto java.lang.Object non ha nulla di speciale (a parte il fatto di essere la classe base di tutti gli oggetti).
    Non puoi dichiarare:

    class B<T extends UnaQualunqueInterfaccia>
    oppure
    class B<T extends UnaQualunqueClasse>

    perché automaticamente butteresti fuori dal limite l'utilizzabilità di Object come parametrizzazione concreta (a meno che UnaQualunqueClasse sia proprio Object).

    Quindi l'unica cosa sensata da fare è

    class B<T>

    o al limite

    class B<T extends Object>


    Riguardo Iterable è ancora un altro discorso. Se una classe "generica" è parametrizzata concretamente es. per String (esempio: ArrayList<String>) ci si aspetta che sia Iterable<String>. Ovvero elementi dello stesso tipo della parametrizzazione.

    Nel tuo codice, la parametrizzazione concreta di B è Object (sempre per quel new B<Object>) ma poi nel codice si vede che b è il "target" del for-each che si aspetta di iterare fisso su degli Integer.

    Quindi si potrebbe pensare:

    class B<T> implements Iterable<Integer>

    Il cui senso però sarebbe tutto da capire ...


    P.S. ma chi ti ha dato quel codice?? .... no ... non lo voglio sapere.
  • Re: Generics Type - Classe che implementa Iterable

    Grazie mille!!
    Ti spiego il senso.. Questo è un esercizio d'esame, che mira a valutare quanto uno ha capito i tipi generici. La classe A è completamente priva di senso e significato, così come pure lo sarà la B e come ti dicevo le sue funzioni (ad esempio alla funzione f faccio tornare "ciao"). Il senso è semplicemente riuscire a fare i ragionamenti che tu hai fatto, per arrivare a scrivere la classe B che sia compilabile. Chiaramente io ai tuoi ragionamenti, che mi hanno permesso di compilare il codice, non ci ero arrivata.. Quindi deduco che ho ancora molto da studiare! Ahahahahahaha
    Anzi mi consiglieresti quale testo dove approfondire quest'argomento?
  • Re: Generics Type - Classe che implementa Iterable

    violet_prog ha scritto:


    Anzi mi consiglieresti quale testo dove approfondire quest'argomento?

    Dedicato solo a generics e collections. Davvero ottimo e completo.
Devi accedere o registrarti per scrivere nel forum
5 risposte