Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    134

    Costruttore di un Generics

    Salve.
    Ho questo codice di definizione di un oggetto Generics (due tipi, Tipo1 e Tipo2, fanno da contraltare al "tipo parametro" T):
    codice:
    public class Oggetto<T> {
     
        public Oggetto(T t){
            contenuto=t;
        }
    Ho quindi un main di questo tipo:
    codice:
    public class Start {
     
        public static void main(String[] args) {
            Oggetto<Tipo1> oggetto1= new Oggetto<Tipo1>(new Tipo1());
            Oggetto<Tipo2>  oggetto2= new Oggetto<Tipo2>(new Tipo2());
             
        }
     
    }
    Il dubbio: se sono corrette le 2 sintassi di creazione del tipo Oggetto, il suo costruttore (primo codice) non dovrebbe essere scritto Oggetto<T>(T t) anziché Oggetto(T t)? O forse in esso non si specifica il parametro nel nome perché ridondante?
    Ultima modifica di filips; 09-10-2019 a 17:23
    Per fare un tavolo ci vuole un fiore.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,111
    Non lo si specifica perchè il costruttore non c'entra nulla con la tipizzazione dell'oggetto.

    Il costruttore di una classe è semplicemente un "metodo" (l'ho scritto tra virgolette) che ha lo stesso nome della classe e nessun tipo di ritorno. Questo vale per qualsiasi tipologia di oggetto, sia esso generico o meno.


    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

  3. #3
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    134
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Non lo si specifica perchè il costruttore non c'entra nulla con la tipizzazione dell'oggetto.

    Ciao.
    Grazie. Quindi il tipo sarebbe Oggetto<T>, e ad esso ci si riferisce nella creazione di una sua istanza sostituendo opportunamente il parametro -- che ovviamente diventa indispensabile per caratterizzare il meccanismo/tipo Generics. Resta poi sempre la regola nome classe = nome costruttore, dove il nome classe non comprende il parametro, che serve appunto solo allo scopo di attivare un certo meccanismo evidenziando la presenza del tipo Generics
    Per fare un tavolo ci vuole un fiore.

  4. #4
    Attenzione ad una cosa: un costruttore può essere "generico"!

    Dal JLS §8.8.4:
    A constructor is generic if it declares one or more type variables
    [...]
    It is possible for a constructor to be generic independently of whether the class the constructor is declared in is itself generic.
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  5. #5
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    134
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Attenzione ad una cosa: un costruttore può essere "generico"!

    Dal JLS §8.8.4:
    A constructor is generic if it declares one or more type variables
    [...]
    It is possible for a constructor to be generic independently of whether the class the constructor is declared in is itself generic.
    Interessante e utile questa puntualizzazione. Probabilmente tu fai riferimento a un manuale Java, io uso come supporto alternativo il sito ufficiale (ma di fatto leggo la guida html.it per ragioni di economicità), dove ho appena trovato l'argomento https://docs.oracle.com/javase/tutor...s/methods.html
    Quante sfaccettature questo Java! Come al solito.. Grazie!
    Per fare un tavolo ci vuole un fiore.

  6. #6
    Quote Originariamente inviata da filips Visualizza il messaggio
    Interessante e utile questa puntualizzazione.
    Sì ma a dire il vero mi pare di non aver mai visto un costruttore generico. Devo vedere se trovo qualche esempio reale, concreto.
    Generalmente è sufficiente che la classe dichiari una (o più) type variable, che poi sono in scope sia nel costruttore che nei metodi di istanza (in quelli static no).

    Quote Originariamente inviata da filips Visualizza il messaggio
    Probabilmente tu fai riferimento a un manuale Java,
    Il JLS è il Java Language Specification, il documento di specifica ufficiale del linguaggio:

    https://docs.oracle.com/javase/specs/

    E' un documento abbastanza difficile da leggere, specialmente in certi punti dove c'è molta teoria. Quel punto §8.8.4 citato è tra quelli ragionevolmente "leggibili".
    AndreaSenior Java developerSCJP 5 (91%) – SCWCD 5 (94%)
    Il mio nuovo sito-blog italiano sulla programmazione: andbin.it

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,111
    Sì, corretto (ottimo spunto)... ma in quel caso il segnaposto si antepone al costruttore.
    Nemmeno io l'ho mai visto usare in nessun caso reale... però documentandomi ho trovato diversi esempi, uno in particolare mi è piaciuto:
    https://www.itsbeyondsimple.com/java...c-constructor/

    In pratica questa tipologia di costruttore può essere utilizzata per "limitare" il tipo di parametro che può essere passato. La potrei vedere utile nel caso in cui sia particolarmente difficile o impossibile limitare il tipo di un parametro senza ricorrere ad accrocchi astrusi... se l'uso dei generics semplifica questo tipo di controllo, allora usiamolo (sto pensando ad esempio a un costruttore che voglia limitare un parametro ad un tipo che implementi 2 o più interfacce). Nel caso dell'articoletto che ho linkato, ad esempio, si sarebbe potuto tranquillamente scrivere il costruttore in questo modo:

    codice:
    GenericConsTest(OOPs t) {
       t.displayName();
    }

    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

  8. #8
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    134
    Grazie a tutti per il riferimento a JLS che ignoravo e per il chiaro esempio di costruttore generico
    Per fare un tavolo ci vuole un fiore.

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 © 2019 vBulletin Solutions, Inc. All rights reserved.