1
00:00:02,200 --> 00:00:09,610
Ciao, non c'è da meravigliarsi che abbiamo guardato i tipi generici ora è il momento di esaminare i metodi generici.

2
00:00:09,610 --> 00:00:15,880
È un argomento importante ed è particolarmente utile per l'implementazione di metodi di utilità statici

3
00:00:15,880 --> 00:00:17,740
che sono molto riutilizzabili.

4
00:00:17,740 --> 00:00:21,220
In questa lezione esamineremo tutto ciò che riguarda i metodi generici.

5
00:00:21,220 --> 00:00:26,230
E sarà un ascolto piuttosto lungo sulla demo che verrà effettivamente eseguito nel test di follow-up

6
00:00:26,590 --> 00:00:27,610
molto molto testato.

7
00:00:27,610 --> 00:00:35,240
La maggior parte delle cose che apprendiamo in questa lezione c'è un eccellente capitolo dedicato ai generici

8
00:00:35,240 --> 00:00:37,110
nel libro Effective Java.

9
00:00:37,280 --> 00:00:39,960
Copriamo molte delle cose del capitolo.

10
00:00:40,010 --> 00:00:45,680
Se sei interessato, dovresti assolutamente leggerlo quando hai la possibilità su uno degli elementi di questi

11
00:00:45,740 --> 00:00:52,510
tipi generici di freeware e abbiamo già discusso alcune cose da questo articolo i tipi generici sono appropriati per

12
00:00:52,660 --> 00:01:00,250
le classi di tipi di contenitore come quelle nell'API delle raccolte che è in grado di memorizzare qualsiasi tipo di elemento che

13
00:01:00,250 --> 00:01:06,090
è che queste classi sono molto generiche, infatti tutte le classi di framework di raccolte che

14
00:01:06,110 --> 00:01:13,440
abbiamo visto vanno generalmente bene prima dell'introduzione dei generici collezioni Le classi API utilizzavano il tipo di oggetto come tipo polimorfico

15
00:01:13,440 --> 00:01:15,480
per la memorizzazione degli elementi.

16
00:01:15,810 --> 00:01:21,780
Cioè metodi come IDE utilizzerebbero il tipo di oggetto come tipo di parametro del metodo e sappiamo

17
00:01:21,780 --> 00:01:28,870
che ciò potrebbe portare alla contabilità delle eccezioni del cast di classe, quindi i generici ci aiutano a scrivere un codice

18
00:01:28,870 --> 00:01:35,710
più sicuro per compilare il vantaggio di sicurezza del tipo di tempo che offre a tali classi che sono davvero molto

19
00:01:35,710 --> 00:01:44,130
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

20
00:01:44,400 --> 00:01:50,890
e c'è anche un elemento dedicato per questo che dice che erano metodi generici liberi come i tipi generici.

21
00:01:51,000 --> 00:01:53,120
Questi metodi sono molto generici.

22
00:01:54,060 --> 00:02:00,900
Sappiamo che con tipi generici il codice client ha la flessibilità di usare correttamente argomenti di tipo diverso.

23
00:02:01,320 --> 00:02:07,590
Allo stesso modo i metodi generici hanno anche i propri parametri di tipo e i client ottengono il vantaggio di utilizzare

24
00:02:07,590 --> 00:02:09,130
diversi argomenti di tipo.

25
00:02:09,210 --> 00:02:15,110
Ovviamente otteniamo anche quel vantaggio in termini di sicurezza del tipo di tempo di compilazione sulla convenienza del

26
00:02:15,120 --> 00:02:17,300
costo implicito che il compilatore inserisce.

27
00:02:17,370 --> 00:02:23,760
Ora sappiamo che se un metodo è statico non ha accesso alle classi di chiusura e per parametro.

28
00:02:23,760 --> 00:02:24,060
Giusto.

29
00:02:24,570 --> 00:02:30,630
Quindi se un tale metodo statico richiede una massa generica, allora deve essere creato un metodo generico.

30
00:02:30,630 --> 00:02:37,310
Quindi, sia i metodi statici che quelli di istanza possono essere metodi di utilità statici generici sono candidati

31
00:02:37,310 --> 00:02:39,280
particolarmente validi per i generici.

32
00:02:39,350 --> 00:02:46,010
Ad esempio, puoi chiamare le raccolte di punti dot della classe di utilità Java e vedrai che la maggior parte dei

33
00:02:46,010 --> 00:02:47,780
suoi metodi sono metodi generici.

34
00:02:48,440 --> 00:02:53,780
E sappiamo che questi metodi sono metodi di utilità che sono molto generici e

35
00:02:53,840 --> 00:03:02,120
quindi sono candidati perfetti per metodi generici come le classi sui metodi di interfaccia e anche i costruttori possono introdurre i propri

36
00:03:02,120 --> 00:03:06,940
parametri di tipo e fa la sintassi per i metodi generici.

37
00:03:06,940 --> 00:03:13,660
In modo che i parametri del tipo siano specificati tra parentesi angolari e come puoi vedere, possono essere usati come tipi

38
00:03:13,660 --> 00:03:18,190
variabili per i parametri del metodo, ma non sono solo parametri del metodo.

39
00:03:18,190 --> 00:03:23,830
Possono essere usati come tipo per le variabili locali che sono dichiarate nel corpo dei metodi e

40
00:03:23,830 --> 00:03:32,050
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

41
00:03:32,170 --> 00:03:33,100
di ritorno.

42
00:03:33,850 --> 00:03:40,740
Quindi vengono prima del metodo per restituire il tipo non diamo un'occhiata ad alcuni esempi di metodi generici.

43
00:03:40,770 --> 00:03:44,770
Eccone uno dall'interfaccia della collezione d'arte Java dark utility.

44
00:03:45,210 --> 00:03:51,290
Come puoi vedere, sia il parametro del metodo che il tipo restituito utilizzano il parametro type.

45
00:03:51,380 --> 00:03:57,320
Questo è un metodo di istanza e sappiamo che restituisce un array contenente tutti gli elementi

46
00:03:57,320 --> 00:03:58,760
nella raccolta corrente.

47
00:03:58,760 --> 00:04:06,240
Funziona fondamentalmente come un ponte tra la raccolta e l'array e qui è un altro esempio dell'API Java è

48
00:04:06,240 --> 00:04:13,060
un metodo di utilità statica che sostituisce tutto dalle raccolte di punti dot della classe Java.

49
00:04:13,170 --> 00:04:16,530
Il precedente era da Java punto che fai raccolta punti.

50
00:04:16,770 --> 00:04:18,800
Anche in questo caso proviene dalle collezioni qui.

51
00:04:18,810 --> 00:04:25,820
Il parametro type funge da argomento type per list nel primo parametro del metodo rimanente

52
00:04:25,820 --> 00:04:33,930
I parametri del metodo Blue utilizzati anche dai parametri su questo metodo sostituiscono tutte le occorrenze del vecchio valore

53
00:04:34,020 --> 00:04:37,320
all'interno dell'elenco con il nuovo valore specificato.

54
00:04:37,560 --> 00:04:44,160
Come puoi vedere, il metodo è generico e non importa quale sia il tipo di

55
00:04:44,160 --> 00:04:51,120
elemento dell'elenco, quindi questi tipi di metodi dovrebbero essere implementati come metodi generici in questo esempio.

56
00:04:51,120 --> 00:04:57,840
Abbiamo la demo di genetica di classe che ha un parametro di tipo d e il metodo go definisce anche il parametro

57
00:04:57,840 --> 00:04:59,910
di tipo con lo stesso nome.

58
00:04:59,920 --> 00:05:06,600
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

59
00:05:06,600 --> 00:05:10,060
metodo viene invocato sotto il colore del carattere blu qui evidenzia che.

60
00:05:10,790 --> 00:05:19,750
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

61
00:05:19,750 --> 00:05:24,920
libro a livello materno e vengono utilizzati parametri di tipo a livello di classe.

62
00:05:25,390 --> 00:05:30,460
Il primo parametro del metodo utilizza il parametro del tipo di livello del metodo, mentre il secondo utilizza il parametro del

63
00:05:30,460 --> 00:05:33,900
tipo di livello della classe e non verrà visualizzato un errore di compilazione.

64
00:05:33,970 --> 00:05:40,990
Se questo metodo è un metodo statico perché il livello di classe per parametro non può essere utilizzato in un

65
00:05:41,800 --> 00:05:50,070
contesto statico, può essere utilizzato solo con istanze e qui è un esempio in cui abbiamo un parametro di tipo legato che conosciamo pone

66
00:05:50,070 --> 00:05:56,550
restrizioni su ciò che può essere passato o cosa può essere restituito se il parametro type viene

67
00:05:56,550 --> 00:05:58,130
utilizzato come tipo restituito.

68
00:05:58,170 --> 00:06:04,320
In questo esempio abbiamo più obbligazioni e sappiamo che tutto ciò di cui abbiamo discusso sulle obbligazioni per i parametri

69
00:06:04,320 --> 00:06:07,430
di tipo di classe si applica anche ai metodi.

70
00:06:07,560 --> 00:06:13,560
Ad esempio, se hai una classe nell'elenco delle obbligazioni, questa può essere l'unica classe nell'elenco delle obbligazioni.

71
00:06:13,950 --> 00:06:20,070
E deve essere specificato come il primo Bond a disordini deve essere un'interfaccia.

72
00:06:20,070 --> 00:06:24,550
Anche l'argomento pipe deve essere il sottotipo di tutte le bombe.

73
00:06:24,570 --> 00:06:30,820
A breve vedremo come l'argomento tipo verrà passato ai metodi generici.

74
00:06:30,830 --> 00:06:37,190
Puoi anche avere qualcosa del genere in cui il parametro del tipo di livello di metodo B

75
00:06:37,190 --> 00:06:42,720
estende il parametro del tipo di livello di classe e k in questo esempio.

76
00:06:42,720 --> 00:06:46,260
Il secondo parametro di tipo sta estendendo il

77
00:06:49,360 --> 00:06:54,740
parametro foster non è che possono esistere metodi generici o anche costruttori generici.

78
00:06:54,740 --> 00:07:02,590
Indipendentemente dal fatto che il tipo racchiuso sia generico o meno, abbiamo esaminato la sintassi per dichiarare metodi generici.

79
00:07:02,610 --> 00:07:09,150
Ora è il momento di vedere come possiamo invocare i metodi generici vengono invocati proprio come i

80
00:07:09,150 --> 00:07:16,230
normali metodi non generici, solo una cosa aggiuntiva sta specificando l'argomento del tipo dato che abbiamo a che fare

81
00:07:16,230 --> 00:07:22,680
con i generici qui sappiamo che i tipi di parametro con tipi generici includono quell'argomento di

82
00:07:22,680 --> 00:07:29,730
tipo ma con l'argomento tipo metodi generici può essere dedotto automaticamente dal compilatore oppure può anche essere esplicitamente specificato

83
00:07:29,880 --> 00:07:31,760
nel metodo nell'istruzione vocazione.

84
00:07:32,490 --> 00:07:38,970
Ma il modo più comune è quello di imparare gli argomenti di tipo che il compilatore deve

85
00:07:38,980 --> 00:07:47,480
dedurre automaticamente. Innanzitutto, vediamo come può essere fatto, consideriamo questo metodo che ha un parametro di tipo B e D usato anche

86
00:07:47,500 --> 00:07:55,140
come parte del parametro del metodo e anche chiedi al tipo restituito non supponiamo che sia coinvolto in questo modo

87
00:07:55,140 --> 00:08:02,680
raddoppierebbe il suo passato in questo caso l'argomento tipo verrebbe dedotto come doppia nota che anche se siamo primitivi questo

88
00:08:02,690 --> 00:08:07,790
argomento del tipo inferito dedotto sarebbe il doppio primitivo inscatolato in modo simile

89
00:08:09,540 --> 00:08:14,250
se noi lavorare con l'argomento tipo stringa verrebbe dedotto come stringa.

90
00:08:14,250 --> 00:08:22,020
Quindi, come puoi vedere, i metodi generici appaiono infinitamente sovraccaricati, ma l'inferenza del tipo non può avvenire in

91
00:08:22,020 --> 00:08:23,120
due punti.

92
00:08:23,190 --> 00:08:29,340
Uno è ovviamente qui nei metodi generici e anche nei costruttori generali in altri luoghi

93
00:08:29,340 --> 00:08:36,270
quando usiamo la notazione Diamond durante l'istanza spesso generiamo tipi ed ecco un esempio di questo e

94
00:08:36,270 --> 00:08:38,830
lo abbiamo usato nelle nostre demo.

95
00:08:38,850 --> 00:08:43,180
La notazione a diamante funziona solo dalle 7 in poi.

96
00:08:43,220 --> 00:08:47,670
Ora sappiamo che il parametro type può apparire come metodi nel tipo restituito 2.

97
00:08:47,750 --> 00:08:54,410
Quindi una domanda che possiamo avere è cosa succede se per parametro appare solo nel tipo restituito ma

98
00:08:54,410 --> 00:09:01,250
non come parte del parametro metodo in un caso del genere il compilatore deduce tale argomento dal contesto chiamante.

99
00:09:01,740 --> 00:09:04,840
Vediamo come funziona.

100
00:09:04,850 --> 00:09:10,090
Qui abbiamo questo metodo MP list dalla classe di collezioni che abbiamo visto

101
00:09:10,080 --> 00:09:19,400
nelle raccolte dal capitolo del libro qui il tipo di ritorno è list off e il metodo non ha alcun parametro no supponiamo che il

102
00:09:19,400 --> 00:09:21,830
metodo sia invocato in questo modo.

103
00:09:21,830 --> 00:09:29,120
Qui il valore restituito viene assegnato a un elenco di stringhe sul compilatore che lo utilizza per inferire

104
00:09:29,210 --> 00:09:36,450
quell'argomento di tipo come stringa qui il compilatore confronterà l'elenco con quell'elenco di stringhe per dedurre che l'argomento

105
00:09:36,440 --> 00:09:43,660
di tipo è stringa in questo caso elenco di la stringa viene definita tipo di destinazione.

106
00:09:43,670 --> 00:09:50,450
Si noti che qui anche se il tipo Target fosse una raccolta di stringhe che è un super tipo

107
00:09:50,480 --> 00:09:56,170
di elenco, il compilatore sarebbe comunque abbastanza intelligente da dedurre l'argomento type come stringa n.

108
00:09:56,170 --> 00:09:57,850
Ecco l'esempio che abbiamo visto prima.

109
00:09:58,450 --> 00:10:02,920
Ora diciamo che stiamo lavorando con una stringa ma il tipo di destinazione è il doppio.

110
00:10:02,920 --> 00:10:09,400
Ora in questo caso l'argomento del tipo dedotto sarebbe stringa poiché il parametro del metodo coinvolge il parametro del tipo, quindi ancora

111
00:10:10,740 --> 00:10:16,800
una volta solo i parametri del metodo utilizzati non includono un parametro del tipo, quindi il tipo di destinazione entra

112
00:10:16,800 --> 00:10:20,200
in gioco in questo caso otteniamo un errore del compilatore.

113
00:10:20,410 --> 00:10:27,090
Questo perché l'argomento type ha inferito una stringa sul compilatore si aspetta che il valore scritto sia stringa

114
00:10:27,090 --> 00:10:31,900
2 poiché anche il parametro type viene specificato come metodo da restituire.

115
00:10:32,760 --> 00:10:35,220
Ma il valore scritto viene assegnato a un doppio.

116
00:10:35,480 --> 00:10:42,440
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.

117
00:10:44,160 --> 00:10:45,680
Ecco qualcosa di più interessante.

118
00:10:45,900 --> 00:10:48,260
Entrambi i parametri sul tipo restituito.

119
00:10:48,270 --> 00:10:54,390
Usa quel parametro di tipo ed ecco l'istruzione di invocazione del metodo il primo argomento è una stringa.

120
00:10:54,400 --> 00:10:56,240
Bene, il secondo è un idealista.

121
00:10:56,320 --> 00:11:04,610
In questo caso il tipo inferito sarà il super tipo comune più specifico tra i due argomenti in questo caso sarebbe

122
00:11:04,610 --> 00:11:11,240
serializzare un proiettile poiché entrambe le stringhe sul nostro attrezzo idealista C realizzabili qui target tipo

123
00:11:11,470 --> 00:11:17,410
C realizzabili ma se non è altro che serializzare tabella quindi finiremmo con

124
00:11:17,410 --> 00:11:23,360
un errore di compilazione quindi è così che digito gli argomenti in genere sono inferiti.

125
00:11:23,470 --> 00:11:26,190
Le regole di inferenza del tipo sono molto complesse.

126
00:11:26,590 --> 00:11:33,550
Se l'inferenza del tipo potrebbe non essere quella che ci aspettavamo, il che è possibile anche

127
00:11:33,550 --> 00:11:42,640
in alcuni casi molto rari, è possibile utilizzare argomenti di tipo esplicito, non vediamo come possiamo specificare esplicitamente argomenti di tipo.

128
00:11:42,640 --> 00:11:50,110
Qui abbiamo il metodo andare all'interno della demo generics di classe e qui stiamo creando un'istanza di demo

129
00:11:50,110 --> 00:11:50,740
genetica.

130
00:11:50,930 --> 00:11:52,480
E poi stiamo invocando la questione.

131
00:11:52,490 --> 00:12:00,200
Continuare specificando esplicitamente che l'argomento tipo double argomento argomento tipo viene dopo l'operatore del cane attivo prima che il

132
00:12:00,360 --> 00:12:04,180
nome del metodo debba essere tra parentesi angolate.

133
00:12:05,920 --> 00:12:13,370
Si noti che qui l'argomento tipo viene indicato in quanto tipo testimone non del metodo è nella stessa

134
00:12:13,370 --> 00:12:15,550
classe dovrebbe essere più preciso.

135
00:12:15,560 --> 00:12:21,100
Stesso oggetto del codice di lavoro, allora dovresti usare questo riferimento.

136
00:12:21,180 --> 00:12:26,990
Ora senza questo riferimento se hai solo l'argomento type seguito da method e location allora otterrai

137
00:12:26,990 --> 00:12:30,790
un errore di coazione se fosse un metodo non generico.

138
00:12:30,900 --> 00:12:38,290
Possiamo invocare direttamente il metodo, ma non è il caso dei metodi genetici se si desidera accedere e

139
00:12:38,290 --> 00:12:44,660
ordinarlo e il metodo nella superclasse, quindi è necessario utilizzare la super parola chiave

140
00:12:44,660 --> 00:12:46,070
anziché questo riferimento.

141
00:12:46,070 --> 00:12:53,830
Ma per il normale metodo genetico ereditato useresti comunque questo riferimento alla fine se il metodo è

142
00:12:53,830 --> 00:12:59,460
statico, useresti semplicemente il nome della classe invece della variabile di riferimento.

143
00:12:59,480 --> 00:13:05,710
Questo è necessario anche se il metodo è nella stessa classe, quindi normalmente puoi andare con il primo approccio in cui

144
00:13:05,770 --> 00:13:08,200
gli argomenti del tipo vengono automaticamente dedotti.

145
00:13:08,650 --> 00:13:15,370
Ma come accennato in precedenza solo in alcuni casi molto rari in cui l'inferenza di tipo potrebbe non essere quella

146
00:13:15,880 --> 00:13:19,900
che ti aspettavi, puoi ottenere specifiche di argomenti di tipo esplicito.

147
00:13:20,110 --> 00:13:25,930
Un'ultima cosa da notare è che se hai un parametro di tipo dichiarato nel metodo ma

148
00:13:25,930 --> 00:13:32,260
se non compare nell'elenco dei parametri del metodo tutti i metodi che puoi digitare, possiamo passare esplicitamente l'argomento

149
00:13:32,260 --> 00:13:37,360
type come in questo caso in combattimento argomento tipo non è proprio possibile.

150
00:13:38,400 --> 00:13:43,380
Tuttavia, in questo caso il parametro type non svolge alcun ruolo prezioso.

151
00:13:43,380 --> 00:13:48,030
Il motivo è che i parametri sono principalmente utili per il codice lato client.

152
00:13:48,210 --> 00:13:54,010
Ad esempio, se il tipo scritto è un parametro di tipo, il compilatore inserirà un cast appropriato nel codice

153
00:13:54,070 --> 00:13:54,780
di richiamo.

154
00:13:55,770 --> 00:14:02,280
Allo stesso modo se i parametri del metodo usano il parametro type, il compilatore assicura che passiamo gli

155
00:14:02,280 --> 00:14:08,940
argomenti corretti ma se il parametro type non fa parte del tipo frequente o dei parametri del metodo,

156
00:14:08,940 --> 00:14:15,440
non c'è nulla da fare sul lato client se non passare esplicitamente quell'argomento type e all'interno del metodo

157
00:14:15,440 --> 00:14:22,400
i parametri vengono cancellati in fase di esecuzione poiché vengono sostituiti dal tipo di oggetto o dal primo nato a

158
00:14:22,550 --> 00:14:24,840
causa della cancellazione del tipo.

159
00:14:24,880 --> 00:14:31,360
Discutiamo anche la cancellazione dei tipi in precedenza quando discutiamo il livello di classe per parametri, quindi dobbiamo tenere a mente

160
00:14:31,360 --> 00:14:34,670
che i generici sono un concetto di tempo puramente compilabile.

161
00:14:35,800 --> 00:14:37,550
Quindi si tratta di metodi generici.

162
00:14:37,690 --> 00:14:43,330
Un paio di dettagli molto minori, inclusi costruttori generici che vengono lasciati fuori, saranno trattati nella

163
00:14:43,330 --> 00:14:44,750
demo di follow-up.

164
00:14:44,980 --> 00:14:50,440
I costruttori generici sono simili ai metodi generici anche nella sezione risorse.

165
00:14:50,440 --> 00:14:57,070
Ho incluso un link a un sito grep che è considerato una delle fonti online più autorevoli sui

166
00:14:57,070 --> 00:15:01,580
farmaci generici, quindi puoi verificarlo e probabilmente anche prenotare il mercato.

167
00:15:01,840 --> 00:15:03,250
Grazie e ci vediamo nella demo.
