Ciao, non c'è da meravigliarsi che abbiamo guardato i tipi generici ora è il momento di esaminare i metodi generici.
È un argomento importante ed è particolarmente utile per l'implementazione di metodi di utilità statici
che sono molto riutilizzabili.
In questa lezione esamineremo tutto ciò che riguarda i metodi generici.
E sarà un ascolto piuttosto lungo sulla demo che verrà effettivamente eseguito nel test di follow-up
molto molto testato.
La maggior parte delle cose che apprendiamo in questa lezione c'è un eccellente capitolo dedicato ai generici
nel libro Effective Java.
Copriamo molte delle cose del capitolo.
Se sei interessato, dovresti assolutamente leggerlo quando hai la possibilità su uno degli elementi di questi
tipi generici di freeware e abbiamo già discusso alcune cose da questo articolo i tipi generici sono appropriati per
le classi di tipi di contenitore come quelle nell'API delle raccolte che è in grado di memorizzare qualsiasi tipo di elemento che
è che queste classi sono molto generiche, infatti tutte le classi di framework di raccolte che
abbiamo visto vanno generalmente bene prima dell'introduzione dei generici collezioni Le classi API utilizzavano il tipo di oggetto come tipo polimorfico
per la memorizzazione degli elementi.
Cioè metodi come IDE utilizzerebbero il tipo di oggetto come tipo di parametro del metodo e sappiamo
che ciò potrebbe portare alla contabilità delle eccezioni del cast di classe, quindi i generici ci aiutano a scrivere un codice
più sicuro per compilare il vantaggio di sicurezza del tipo di tempo che offre a tali classi che sono davvero molto
generici e quindi se ci capita di scrivere classi generiche, allora dovremmo provare a trasformarle in tipi generici in modo simile, abbiamo anche metodi generici
e c'è anche un elemento dedicato per questo che dice che erano metodi generici liberi come i tipi generici.
Questi metodi sono molto generici.
Sappiamo che con tipi generici il codice client ha la flessibilità di usare correttamente argomenti di tipo diverso.
Allo stesso modo i metodi generici hanno anche i propri parametri di tipo e i client ottengono il vantaggio di utilizzare
diversi argomenti di tipo.
Ovviamente otteniamo anche quel vantaggio in termini di sicurezza del tipo di tempo di compilazione sulla convenienza del
costo implicito che il compilatore inserisce.
Ora sappiamo che se un metodo è statico non ha accesso alle classi di chiusura e per parametro.
Giusto.
Quindi se un tale metodo statico richiede una massa generica, allora deve essere creato un metodo generico.
Quindi, sia i metodi statici che quelli di istanza possono essere metodi di utilità statici generici sono candidati
particolarmente validi per i generici.
Ad esempio, puoi chiamare le raccolte di punti dot della classe di utilità Java e vedrai che la maggior parte dei
suoi metodi sono metodi generici.
E sappiamo che questi metodi sono metodi di utilità che sono molto generici e
quindi sono candidati perfetti per metodi generici come le classi sui metodi di interfaccia e anche i costruttori possono introdurre i propri
parametri di tipo e fa la sintassi per i metodi generici.
In modo che i parametri del tipo siano specificati tra parentesi angolari e come puoi vedere, possono essere usati come tipi
variabili per i parametri del metodo, ma non sono solo parametri del metodo.
Possono essere usati come tipo per le variabili locali che sono dichiarate nel corpo dei metodi e
possono anche essere usati come metodi di tipo di ritorno, non che l'elenco dei parametri di tipo vada tra i modificatori dei metodi e il tipo
di ritorno.
Quindi vengono prima del metodo per restituire il tipo non diamo un'occhiata ad alcuni esempi di metodi generici.
Eccone uno dall'interfaccia della collezione d'arte Java dark utility.
Come puoi vedere, sia il parametro del metodo che il tipo restituito utilizzano il parametro type.
Questo è un metodo di istanza e sappiamo che restituisce un array contenente tutti gli elementi
nella raccolta corrente.
Funziona fondamentalmente come un ponte tra la raccolta e l'array e qui è un altro esempio dell'API Java è
un metodo di utilità statica che sostituisce tutto dalle raccolte di punti dot della classe Java.
Il precedente era da Java punto che fai raccolta punti.
Anche in questo caso proviene dalle collezioni qui.
Il parametro type funge da argomento type per list nel primo parametro del metodo rimanente
I parametri del metodo Blue utilizzati anche dai parametri su questo metodo sostituiscono tutte le occorrenze del vecchio valore
all'interno dell'elenco con il nuovo valore specificato.
Come puoi vedere, il metodo è generico e non importa quale sia il tipo di
elemento dell'elenco, quindi questi tipi di metodi dovrebbero essere implementati come metodi generici in questo esempio.
Abbiamo la demo di genetica di classe che ha un parametro di tipo d e il metodo go definisce anche il parametro
di tipo con lo stesso nome.
B In questo caso il parametro del tipo di livello del metodo o il parametro del tipo di livello della classe di bestiame quando il
metodo viene invocato sotto il colore del carattere blu qui evidenzia che.
Tuttavia, cerca di evitare di usare gli stessi nomi dei parametri dello stesso tipo in questo modo perché può essere molto confuso, possiamo anche avere questo
libro a livello materno e vengono utilizzati parametri di tipo a livello di classe.
Il primo parametro del metodo utilizza il parametro del tipo di livello del metodo, mentre il secondo utilizza il parametro del
tipo di livello della classe e non verrà visualizzato un errore di compilazione.
Se questo metodo è un metodo statico perché il livello di classe per parametro non può essere utilizzato in un
contesto statico, può essere utilizzato solo con istanze e qui è un esempio in cui abbiamo un parametro di tipo legato che conosciamo pone
restrizioni su ciò che può essere passato o cosa può essere restituito se il parametro type viene
utilizzato come tipo restituito.
In questo esempio abbiamo più obbligazioni e sappiamo che tutto ciò di cui abbiamo discusso sulle obbligazioni per i parametri
di tipo di classe si applica anche ai metodi.
Ad esempio, se hai una classe nell'elenco delle obbligazioni, questa può essere l'unica classe nell'elenco delle obbligazioni.
E deve essere specificato come il primo Bond a disordini deve essere un'interfaccia.
Anche l'argomento pipe deve essere il sottotipo di tutte le bombe.
A breve vedremo come l'argomento tipo verrà passato ai metodi generici.
Puoi anche avere qualcosa del genere in cui il parametro del tipo di livello di metodo B
estende il parametro del tipo di livello di classe e k in questo esempio.
Il secondo parametro di tipo sta estendendo il
parametro foster non è che possono esistere metodi generici o anche costruttori generici.
Indipendentemente dal fatto che il tipo racchiuso sia generico o meno, abbiamo esaminato la sintassi per dichiarare metodi generici.
Ora è il momento di vedere come possiamo invocare i metodi generici vengono invocati proprio come i
normali metodi non generici, solo una cosa aggiuntiva sta specificando l'argomento del tipo dato che abbiamo a che fare
con i generici qui sappiamo che i tipi di parametro con tipi generici includono quell'argomento di
tipo ma con l'argomento tipo metodi generici può essere dedotto automaticamente dal compilatore oppure può anche essere esplicitamente specificato
nel metodo nell'istruzione vocazione.
Ma il modo più comune è quello di imparare gli argomenti di tipo che il compilatore deve
dedurre automaticamente. Innanzitutto, vediamo come può essere fatto, consideriamo questo metodo che ha un parametro di tipo B e D usato anche
come parte del parametro del metodo e anche chiedi al tipo restituito non supponiamo che sia coinvolto in questo modo
raddoppierebbe il suo passato in questo caso l'argomento tipo verrebbe dedotto come doppia nota che anche se siamo primitivi questo
argomento del tipo inferito dedotto sarebbe il doppio primitivo inscatolato in modo simile
se noi lavorare con l'argomento tipo stringa verrebbe dedotto come stringa.
Quindi, come puoi vedere, i metodi generici appaiono infinitamente sovraccaricati, ma l'inferenza del tipo non può avvenire in
due punti.
Uno è ovviamente qui nei metodi generici e anche nei costruttori generali in altri luoghi
quando usiamo la notazione Diamond durante l'istanza spesso generiamo tipi ed ecco un esempio di questo e
lo abbiamo usato nelle nostre demo.
La notazione a diamante funziona solo dalle 7 in poi.
Ora sappiamo che il parametro type può apparire come metodi nel tipo restituito 2.
Quindi una domanda che possiamo avere è cosa succede se per parametro appare solo nel tipo restituito ma
non come parte del parametro metodo in un caso del genere il compilatore deduce tale argomento dal contesto chiamante.
Vediamo come funziona.
Qui abbiamo questo metodo MP list dalla classe di collezioni che abbiamo visto
nelle raccolte dal capitolo del libro qui il tipo di ritorno è list off e il metodo non ha alcun parametro no supponiamo che il
metodo sia invocato in questo modo.
Qui il valore restituito viene assegnato a un elenco di stringhe sul compilatore che lo utilizza per inferire
quell'argomento di tipo come stringa qui il compilatore confronterà l'elenco con quell'elenco di stringhe per dedurre che l'argomento
di tipo è stringa in questo caso elenco di la stringa viene definita tipo di destinazione.
Si noti che qui anche se il tipo Target fosse una raccolta di stringhe che è un super tipo
di elenco, il compilatore sarebbe comunque abbastanza intelligente da dedurre l'argomento type come stringa n.
Ecco l'esempio che abbiamo visto prima.
Ora diciamo che stiamo lavorando con una stringa ma il tipo di destinazione è il doppio.
Ora in questo caso l'argomento del tipo dedotto sarebbe stringa poiché il parametro del metodo coinvolge il parametro del tipo, quindi ancora
una volta solo i parametri del metodo utilizzati non includono un parametro del tipo, quindi il tipo di destinazione entra
in gioco in questo caso otteniamo un errore del compilatore.
Questo perché l'argomento type ha inferito una stringa sul compilatore si aspetta che il valore scritto sia stringa
2 poiché anche il parametro type viene specificato come metodo da restituire.
Ma il valore scritto viene assegnato a un doppio.
Quindi il compilatore fornisce un errore, questo è un esempio di vantaggio in termini di sicurezza del tipo di tempo di compilazione in un metodo generico.
Ecco qualcosa di più interessante.
Entrambi i parametri sul tipo restituito.
Usa quel parametro di tipo ed ecco l'istruzione di invocazione del metodo il primo argomento è una stringa.
Bene, il secondo è un idealista.
In questo caso il tipo inferito sarà il super tipo comune più specifico tra i due argomenti in questo caso sarebbe
serializzare un proiettile poiché entrambe le stringhe sul nostro attrezzo idealista C realizzabili qui target tipo
C realizzabili ma se non è altro che serializzare tabella quindi finiremmo con
un errore di compilazione quindi è così che digito gli argomenti in genere sono inferiti.
Le regole di inferenza del tipo sono molto complesse.
Se l'inferenza del tipo potrebbe non essere quella che ci aspettavamo, il che è possibile anche
in alcuni casi molto rari, è possibile utilizzare argomenti di tipo esplicito, non vediamo come possiamo specificare esplicitamente argomenti di tipo.
Qui abbiamo il metodo andare all'interno della demo generics di classe e qui stiamo creando un'istanza di demo
genetica.
E poi stiamo invocando la questione.
Continuare specificando esplicitamente che l'argomento tipo double argomento argomento tipo viene dopo l'operatore del cane attivo prima che il
nome del metodo debba essere tra parentesi angolate.
Si noti che qui l'argomento tipo viene indicato in quanto tipo testimone non del metodo è nella stessa
classe dovrebbe essere più preciso.
Stesso oggetto del codice di lavoro, allora dovresti usare questo riferimento.
Ora senza questo riferimento se hai solo l'argomento type seguito da method e location allora otterrai
un errore di coazione se fosse un metodo non generico.
Possiamo invocare direttamente il metodo, ma non è il caso dei metodi genetici se si desidera accedere e
ordinarlo e il metodo nella superclasse, quindi è necessario utilizzare la super parola chiave
anziché questo riferimento.
Ma per il normale metodo genetico ereditato useresti comunque questo riferimento alla fine se il metodo è
statico, useresti semplicemente il nome della classe invece della variabile di riferimento.
Questo è necessario anche se il metodo è nella stessa classe, quindi normalmente puoi andare con il primo approccio in cui
gli argomenti del tipo vengono automaticamente dedotti.
Ma come accennato in precedenza solo in alcuni casi molto rari in cui l'inferenza di tipo potrebbe non essere quella
che ti aspettavi, puoi ottenere specifiche di argomenti di tipo esplicito.
Un'ultima cosa da notare è che se hai un parametro di tipo dichiarato nel metodo ma
se non compare nell'elenco dei parametri del metodo tutti i metodi che puoi digitare, possiamo passare esplicitamente l'argomento
type come in questo caso in combattimento argomento tipo non è proprio possibile.
Tuttavia, in questo caso il parametro type non svolge alcun ruolo prezioso.
Il motivo è che i parametri sono principalmente utili per il codice lato client.
Ad esempio, se il tipo scritto è un parametro di tipo, il compilatore inserirà un cast appropriato nel codice
di richiamo.
Allo stesso modo se i parametri del metodo usano il parametro type, il compilatore assicura che passiamo gli
argomenti corretti ma se il parametro type non fa parte del tipo frequente o dei parametri del metodo,
non c'è nulla da fare sul lato client se non passare esplicitamente quell'argomento type e all'interno del metodo
i parametri vengono cancellati in fase di esecuzione poiché vengono sostituiti dal tipo di oggetto o dal primo nato a
causa della cancellazione del tipo.
Discutiamo anche la cancellazione dei tipi in precedenza quando discutiamo il livello di classe per parametri, quindi dobbiamo tenere a mente
che i generici sono un concetto di tempo puramente compilabile.
Quindi si tratta di metodi generici.
Un paio di dettagli molto minori, inclusi costruttori generici che vengono lasciati fuori, saranno trattati nella
demo di follow-up.
I costruttori generici sono simili ai metodi generici anche nella sezione risorse.
Ho incluso un link a un sito grep che è considerato una delle fonti online più autorevoli sui
farmaci generici, quindi puoi verificarlo e probabilmente anche prenotare il mercato.
Grazie e ci vediamo nella demo.