PDA

View Full Version : java domanda semplice sui generics


vittorio130881
05-01-2015, 15:33
ciao a tutti
sul libro che sto studiando per i parametri covarianti dei generics fa questo esempio


interface Animale<C extends Cibo> {
void mangia(C cibo);
}
public class Carnivoro implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<E extends Erba> implements Cibo, Animale<E> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .
}
}



ma non sarebbe piu chiaro e giusto scrivere cosi?

interface Animale<C extends Cibo> {
void mangia(C cibo);
}
public class Carnivoro<Erbivoro> implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<Erba> implements Cibo, Animale<Erba> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .
}
}


ovvero mettere Erbivoro come tipo della classe carnivoro (o implementando Animale lo eredita??)
e se tanto alla fine erba non ha sottoclassi e carnivoro mangia solo erbivoro mettere direttamente Erba e non E extends erba?


Seconda domanda se potete e volete....
List<String> nomiList = new ArrayList<String>(Arrays.asList(nomi));

dove nomi è un array di stringhe banalissimo con marco paolo e giovanni.....
mi chiedo.........ma dove dico ad Arrays di accettare solo stringhe? dove sta la dichiarazione?
ad esempio nomiList dichiaro che lavora solo con stringhe...e Arrays?

Roran
05-01-2015, 17:09
ciao a tutti
sul libro che sto studiando per i parametri covarianti dei generics fa questo esempio


interface Animale<C extends Cibo> {
void mangia(C cibo);
}
public class Carnivoro implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<E extends Erba> implements Cibo, Animale<E> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .
}
}



ma non sarebbe piu chiaro e giusto scrivere cosi?

interface Animale<C extends Cibo> {
void mangia(C cibo);
}
public class Carnivoro<Erbivoro> implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<Erba> implements Cibo, Animale<Erba> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .
}
}


ovvero mettere Erbivoro come tipo della classe carnivoro (o implementando Animale lo eredita??)
e se tanto alla fine erba non ha sottoclassi e carnivoro mangia solo erbivoro mettere direttamente Erba e non E extends erba?


Seconda domanda se potete e volete....
List<String> nomiList = new ArrayList<String>(Arrays.asList(nomi));

dove nomi è un array di stringhe banalissimo con marco paolo e giovanni.....
mi chiedo.........ma dove dico ad Arrays di accettare solo stringhe? dove sta la dichiarazione?
ad esempio nomiList dichiaro che lavora solo con stringhe...e Arrays?Riguardo la prima domanda, il tipo puoi specificarlo sull'interfaccia Animale perchè li c'è un generics C che estende Cibo, mentre le classi Carnivoro ed Erbivoro le stai scrivendo da zero, non le stai parametrizzando.

Riguardo la seconda domanda, non ho mai visto inizializzare una lista passando Arrays.asList(nomeArray) come parametro al costruttore, ma bensì ho sempre visto e utilizzato soltanto o List<String> nomiList = new ArrayList<String>() per poi utilizzare i metodi add e addall per aggiungere le stringhe singole o da un array, oppure List<String> nomiList = Arrays.asList(nomi) , e in questo caso asList prende come paramento T... nomi, dove T è lo stesso generics che utlizzi per parametrizzare List.

vittorio130881
05-01-2015, 18:26
La seconda ok..... la prima me la rispiegheresti in altre parole per piacere ??????? Grazie mille per l'aiuto

vittorio130881
05-01-2015, 18:34
in pratica non ho capito se sono necessarie le cose scritte in rosso visto che le implementa da animale....


public class Carnivoro implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<E extends Erba> implements Cibo, Animale<E> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .



e perchè solo nel secondo caso è necessarioil rosso e quindi perchè non nella classe Carnivoro??

Roran
05-01-2015, 19:01
in pratica non ho capito se sono necessarie le cose scritte in rosso visto che le implementa da animale....


public class Carnivoro implements Animale<Erbivoro> { public void mangia(Erbivoro erbivoro) { //un carnivoro potrebbe mangiare erbivori } }
public class Erbivoro<E extends Erba> implements Cibo, Animale<E> { public void mangia(E erba) { //un erbivoro mangia erba } public String getColore() { . . .



e perchè solo nel secondo caso è necessarioil rosso e quindi perchè non nella classe Carnivoro??Sono due casi differenti, nel primo parametrizzi solo l'interfaccia, e già gli stai dicendo con che tipo parametrizzare l'interfaccia, nell'altro caso parametrizzi la classe Erbivoro e a sua volta anche l'interfaccia Animale con un tipo che sceglierai al momento in cui stai per istanziare un oggetto di quella classe. Non è necessario, dipende l'uso che ne devi fare.

vittorio130881
05-01-2015, 19:03
grazie