Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465

    L'uso di super nei generic

    Ho capito l'uso di extends nei generic ma non l'uso di super. Sul manuale c'è scritto:

    E' possibile specificare anche un limite inferiore per un jolly aggiungendo una clausola super a una dichiarazione di jolly. Di seguito la forma generale:

    <? super sottoclasse>

    In questo caso sono argomenti accettabili solo le classi che sono superclassi di sottoclassi. Si tratta di una clausola esclusiva, perché non corrisponde alla classe specificata da sottoclasse.
    Ho provato ad editare un codice messo a punto per extends e mi sorgono spontanee queste domande:

    codice:
    // Bounded Wildcard arguments. 
    
    // Two-dimensional coordinates. 
    class TwoD {
    	int x, y;
    
    	TwoD(int a, int b) {
    		x = a;
    		y = b;
    	}
    }
    
    // Three-dimensional coordinates.
    class ThreeD extends TwoD {
    	int z;
    
    	ThreeD(int a, int b, int c) {
    		super(a, b);
    		z = c;
    	}
    }
    
    // Four-dimensional coordinates.
    class FourD extends ThreeD {
    	int t;
    
    	FourD(int a, int b, int c, int d) {
    		super(a, b, c);
    		t = d;
    	}
    }
    
    // This class holds an array of coordinate objects.
    class Coords<T extends TwoD> {
    	T[] coords;
    
    	Coords(T[] o) {
    		coords = o;
    	}
    }
    
    // Demonstrate a bounded wildcard.
    class Esempio {
    	static void showXY(Coords<? super TwoD> c) {
    		System.out.println("X Y Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y);
    		System.out.println();
    	}
    
    	static void showXYZ(Coords<? extends ThreeD> c) {
    		System.out.println("X Y Z Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y + " "
    					+ c.coords[i].z);
    		System.out.println();
    	}
    
    	static void showAll(Coords<? extends FourD> c) {
    		System.out.println("X Y Z T Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y + " "
    					+ c.coords[i].z + " " + c.coords[i].t);
    		System.out.println();
    	}
    
    	public static void main(String args[]) {
    		TwoD td[] = { new TwoD(0, 0), new TwoD(7, 9), new TwoD(18, 4),
    				new TwoD(-1, -23) };
    
    		Coords<TwoD> tdlocs = new Coords<TwoD>(td);
    
    		FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8),
    				new FourD(22, 9, 4, 9), new FourD(3, -2, -23, 17) };
    
    		Coords<FourD> fdlocs = new Coords<FourD>(fd);
    
    		ThreeD td3[] = { new ThreeD(3, 2, 3), new ThreeD(6, 0, 3),
    				new ThreeD(0, 3, 4), new ThreeD(8, 0, -8) };
    
    		Coords<ThreeD> tdlocs3 = new Coords<ThreeD>(td3);
    
    		System.out.println("Proviamo a capire super:");
    		showXY(tdlocs);
    
    	}
    }
    1.Perché sul manuale si dice che super è una clausola esclusica quando in realtà scrivendo <? super TwoD> e showXY(tdlocs); non ho problemi di compilazione. Il libro sta facendo un errore? (si/no)

    codice:
    // Bounded Wildcard arguments. 
    
    // Two-dimensional coordinates. 
    class TwoD {
    	int x, y;
    
    	TwoD(int a, int b) {
    		x = a;
    		y = b;
    	}
    }
    
    // Three-dimensional coordinates.
    class ThreeD extends TwoD {
    	int z;
    
    	ThreeD(int a, int b, int c) {
    		super(a, b);
    		z = c;
    	}
    }
    
    // Four-dimensional coordinates.
    class FourD extends ThreeD {
    	int t;
    
    	FourD(int a, int b, int c, int d) {
    		super(a, b, c);
    		t = d;
    	}
    }
    
    // This class holds an array of coordinate objects.
    class Coords<T extends TwoD> {
    	T[] coords;
    
    	Coords(T[] o) {
    		coords = o;
    	}
    }
    
    // Demonstrate a bounded wildcard.
    class Esempio {
    	static void showXY(Coords<? super TwoD> c) {
    		System.out.println("X Y Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y);
    		System.out.println();
    	}
    
    	static void showXYZ(Coords<? super FourD> c) {
    		System.out.println("X Y Z Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y + " "
    					+ c.coords[i].z);
    		System.out.println();
    	}
    
    	public static void main(String args[]) {
    		TwoD td[] = { new TwoD(0, 0), new TwoD(7, 9), new TwoD(18, 4),
    				new TwoD(-1, -23) };
    
    		Coords<TwoD> tdlocs = new Coords<TwoD>(td);
    
    		FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8),
    				new FourD(22, 9, 4, 9), new FourD(3, -2, -23, 17) };
    
    		Coords<FourD> fdlocs = new Coords<FourD>(fd);
    
    		ThreeD td3[] = { new ThreeD(3, 2, 3), new ThreeD(6, 0, 3),
    				new ThreeD(0, 3, 4), new ThreeD(8, 0, -8) };
    
    		Coords<ThreeD> tdlocs3 = new Coords<ThreeD>(td3);
    
    		System.out.println("Proviamo a capire super:");
    		showXYZ(tdlocs3);
    		
    
    	}
    }
    2.Con "showXYZ(Coords<? super FourD> c)" oppure "showXYZ(Coords<? super ThreeD> c)" e "showXYZ(tdlocs3);" java non funziona ThreeD e FourD sono classi che estendono altre classi e non sono superclassi? (si/no)

    Se mettete due si allora ho capito diversamente mi dovete spiegare... Non capisco perché non faccia un esempio chiaro anche con super...

  2. #2
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    up! up! up!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Rispondo in ordine alle tue domande:

    1.Perché sul manuale si dice che super è una clausola esclusica quando in realtà scrivendo <? super TwoD> e showXY(tdlocs); non ho problemi di compilazione. Il libro sta facendo un errore? (si/no)
    Il fatto che sul tuo manuale ci sia scritto che super è una clausola esclusiva (cosa significhi, lo sa solo l'autore), non significa che non debba compilare. "Esclusiva" non è sinonimo di "vietata", "non ammessa", "scorretta", o altro. Esclusiva significa che esclude qualcosa. Ed in effetti super è un lower-bound wildcard, ciò sifnifica che un contenitore di oggetti di tipo "? super A" potrà contenere oggetti di qualunque tipo da "Object" ad "A" (incluso) nell'albero di ereditarietà, ma nessuna sottoclasse di A. Da questo punto di vista, quel wildcard è molto restrittivo poichè permette di definire un range fisso di oggetti che possono essere utilizzati. Al contrario di "extends" che permette di utilizzare qualunque sottoclassi del segnaposto (e le sottoclassi di un segnaposto, che non sia una classe final, sono infinite).

    2.Con "showXYZ(Coords<? super FourD> c)" oppure "showXYZ(Coords<? super ThreeD> c)" e "showXYZ(tdlocs3);" java non funziona ThreeD e FourD sono classi che estendono altre classi e non sono superclassi? (si/no)
    In realtà l'errore non è esattamente dovuto "super", quanto alla logica che ci sta sotto. Ed, infatti, quel tuo codice genera un errore in compilazione in corrispondenza di questa riga

    codice:
    System.out.println(c.coords[i].x + " " + c.coords[i].y + " "
                       + c.coords[i].z);
    Perchè? La risposta è semplice: il metodo showXYZ(<Coords<? super FourD> c) accetta un oggetto Coords di tipo "qualunque superclasse di FourD. Essendo che Coords è definito come un oggetto che può contenere solo sottoclassi di TwoD, il range di oggetti che quel metodo può accettare è il seguente:

    Coords<TwoD>
    Coords<ThreeD>
    Coords<FourD>

    Cosa succede, quindi, se io passo a tale metodo un oggetto del primo tipo (Coords<TwoD>), cosa del tutto legale? Quell'istruzione non potrà mai funzionare, poichè un oggetto di tipo TwoD non possiede la proprietà "z". Ed il compilatore se ne accorge e si arrabbia.

    Di conseguenza, io metterei due NO come risposte, poichè le motivazioni da te addotte non c'entrano con i problemi da te segnalati.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    1-Allora la frase evidenziata in nero é un inessattezza e andrebbe cancellata? (si/no)

    La frase evidenziata in nero è sbagliata? (si/no)
    In generale, per definire un limite superiore per un jolly utilizzando il tipo di espressione jolly di seguito:
    <? Extends superclasse>
    Dove superclasse è il nome della classe che serve da limite superiore. Si ricordi che si tratta di una clausola inclusiva, perché anche la classe che rappresenta il limite superiore (specificata da superclasse) si trova entro i limiti.
    E' possibile specificare anche un limite inferiore per un jolly aggiungendo una clausola super a una dichiarazione di jolly. Di seguito la forma generale:
    <? super sottoclasse>
    In questo caso sono argomenti accettabili solo le classi che sono superclassi di sottoclassi. Si tratta di una clausola esclusiva, perché non corrisponde alla classe specificata da sottoclasse.
    2-Ho capito super. Quello che dici è giusto infatti se scrivo:

    codice:
    class Coords<T extends ThreeD> {
    	T[] coords;
    
    	Coords(T[] o) {
    		coords = o;
    	}
    }
    
    // Demonstrate a bounded wildcard.
    class EsempioConGenericSuperExtends {
    
    
    	static void showXYZ(Coords<? super ThreeD> c) {
    		System.out.println("X Y Z Coordinates:");
    		for (int i = 0; i < c.coords.length; i++)
    			System.out.println(c.coords[i].x + " " + c.coords[i].y + " "
    					+ c.coords[i].z);
    		System.out.println();
    	}
    showXYZ(tdlocs3); funziona alla perfezione.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ora ho capito cosa intendeva per "esclusiva". La risposta è SI: quella frase è falsa e andrebbe rimossa.

    Dal Tutorial della Sun: http://docs.oracle.com/javase/tutori...s/morefun.html

    The syntax ? super T denotes an unknown type that is a supertype of T (or T itself; remember that the supertype relation is reflexive)
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Grazie LeleFT, mi sembrava che fosse un'inesattezza. Che testo scadente però... pieno di errori... bah...


  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da peruzzo
    Grazie LeleFT, mi sembrava che fosse un'inesattezza. Che testo scadente però... pieno di errori... bah...

    E' il problema dei manuali tradotti dall'inglese alla ca**o
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Haa ecco... tu dici che sia colpa del traduttore... è possibilissimo...

    grazie di nuovo per il vostro aiuto

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da peruzzo
    Haa ecco... tu dici che sia colpa del traduttore... è possibilissimo...
    E' una possibilità. Ricordo che l'edizione che avevo io era abbastanza orribile da questo punto di vista...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.