1
00:00:08,140 --> 00:00:09,060
Ciao.

2
00:00:09,100 --> 00:00:10,330
Questa è la stanza della Lulu.

3
00:00:10,330 --> 00:00:11,550
E bentornato.

4
00:00:11,560 --> 00:00:16,550
Fateci sapere conoscere generici che è stato introdotto nel 5 luglio.

5
00:00:16,600 --> 00:00:21,880
Abbiamo fatto uso di generici in una certa misura nel capitolo quadro delle collezioni e questo deve averti dato

6
00:00:21,880 --> 00:00:23,400
una qualche forma di un'idea.

7
00:00:23,800 --> 00:00:32,840
Ma ora è tempo per noi di avere una comprensione approfondita di questo argomento perché diamo un'occhiata a quali

8
00:00:32,960 --> 00:00:36,760
motivati progettisti di linguaggi introducono i generici.

9
00:00:36,770 --> 00:00:44,840
Ora sappiamo che il polimorfismo promuove la generalizzazione, per esempio le super classi possono essere usate come tipi polimorfi per

10
00:00:44,840 --> 00:00:52,220
i parametri di metodo e di costruzione e possono anche essere usate come tipi di metodi scritti che ci

11
00:00:52,220 --> 00:00:55,870
permettono di passare oggetti di sottoclasse come argomenti.

12
00:00:56,180 --> 00:01:00,620
E possiamo anche restituire oggetti di sottoclasse dai metodi.

13
00:01:00,620 --> 00:01:08,570
Allo stesso modo le interfacce forniscono ancor più generalizzazione in quanto possono essere implementate dalle classi da gerarchie

14
00:01:08,570 --> 00:01:10,660
di classi completamente diverse.

15
00:01:10,660 --> 00:01:14,690
In questo momento consideriamo questo frammento di codice qui.

16
00:01:14,760 --> 00:01:20,730
Il codice categoria è denominato il nostro deposito e memorizza semplicemente un oggetto del segnalibro.

17
00:01:20,730 --> 00:01:28,940
Potete vedere che c'è un setter e getter per impostare e recuperare un oggetto segnalibro e il problema qui è

18
00:01:28,940 --> 00:01:36,980
che il tipo di segnalibro è hardcoded che è un'istanza di un negozio può contenere solo un oggetto segnalibro o

19
00:01:37,010 --> 00:01:39,340
uno dei suoi oggetti sottotipo.

20
00:01:41,230 --> 00:01:49,510
Quindi un modo per generalizzare ulteriormente è definendo il tipo come oggetto come la classe dell'oggetto è la classe e

21
00:01:49,510 --> 00:01:57,520
ogni altra classe discende da essa prima di giustificare l'uso di una classe di oggetti poichè il tipo polimorfico

22
00:01:57,520 --> 00:02:05,950
era un framework di raccolte molto comune avrebbe archiviato istanze di oggetti come elementi e anche come chiavi e valori nelle

23
00:02:05,950 --> 00:02:13,990
mappe, ad esempio prima del file java, il metodo di aggiunta nella nostra classe lista avrebbe come parametro il metodo

24
00:02:13,990 --> 00:02:20,820
ma da Java 5 in poi non è più il caso e fa uso di generici.

25
00:02:20,920 --> 00:02:25,720
Ora vediamo quali problemi possiamo fare usando l'oggetto come tipo qui.

26
00:02:25,960 --> 00:02:28,690
Diamo un'occhiata ad un codice che viene eseguito sequenzialmente.

27
00:02:29,080 --> 00:02:36,880
Supponiamo anche che il codice sia stato scritto da due sviluppatori che lavorano per la stessa società, supponiamo che questo sia un

28
00:02:36,880 --> 00:02:42,530
primo pezzo di codice che viene eseguito su supponiamo che John abbia scritto questo trimestre.

29
00:02:42,880 --> 00:02:50,040
Qui sono archiviate le istanze create sotto l'oggetto Date che è memorizzato all'interno dell'istanza del negozio qui.

30
00:02:50,070 --> 00:02:57,460
La data proviene dal pacchetto Java dot a school in un momento successivo nel codice in cui l'oggetto data che

31
00:02:57,460 --> 00:03:05,240
è stato memorizzato all'interno dell'istanza del negozio viene recuperato, ma poiché il tipo di metodo restituito è object viene applicato un

32
00:03:05,240 --> 00:03:06,240
cast esplicito.

33
00:03:08,110 --> 00:03:13,380
Ora supponiamo anche che su di esso sia stato eseguito il secondo sviluppatore di Harcourt.

34
00:03:13,480 --> 00:03:20,080
In qualche altro posto nel progetto e usa la stessa istanza memorizzata che John ha segnato in

35
00:03:20,110 --> 00:03:24,410
precedenza e ora fa una buona ricerca su tale oggetto.

36
00:03:25,250 --> 00:03:33,860
Tuttavia, Harcourt crea un'istanza della classe data che proviene da un punto Java che hai fatto pacchettizzare l'istanza della

37
00:03:33,860 --> 00:03:40,970
data precedente che era stata impostata da John proveniva finalmente dal pacchetto Java dot school.

38
00:03:40,970 --> 00:03:46,720
Supponiamo che, mentre l'esecuzione del software continua, questo codice venga eseguito.

39
00:03:47,020 --> 00:03:53,700
Supponiamo che la discordia sia scritta ancora una volta da John e che questo codice funzioni ancora sulla stessa istanza

40
00:03:53,700 --> 00:03:54,570
di archivio.

41
00:03:54,750 --> 00:04:02,100
E John sta recuperando l'oggetto Date e tenta di assegnarlo a una variabile di tipo punto Java come carburante che Dot ha fatto

42
00:04:02,110 --> 00:04:05,640
in quanto era il tipo che aveva usato in precedenza.

43
00:04:05,700 --> 00:04:13,530
Quindi si aspettava la stessa istanza di data e ottiene un'eccezione di classe in quanto l'oggetto ora è un'istanza

44
00:04:13,530 --> 00:04:19,430
di punto di Java che indica puntino anziché virgola Java come ha fatto Cuellar.

45
00:04:19,500 --> 00:04:25,620
Quindi c'è una differenza nell'istanza di classe che sta causando questa eccezione.

46
00:04:25,710 --> 00:04:31,820
Quindi questi sono il tipo di problemi che si sono incontrati quando un oggetto è stato usato come un

47
00:04:34,180 --> 00:04:38,630
tipo polimorfico, nessun primo problema qui è che l'oggetto pipe era troppo generico.

48
00:04:39,160 --> 00:04:45,730
E in questo caso particolare permette di memorizzare istanze di input che Jawad non ha

49
00:04:45,790 --> 00:04:54,080
oscurato la nostra data così come Joe o punto per indirizzare il secondo problema è la necessità di un cast esplicito

50
00:04:54,580 --> 00:05:01,480
quindi ottenere il metodo è invocare l'oggetto deve essere fatto castato terzo è l'eccezione sgradevole e grugnendo.

51
00:05:01,480 --> 00:05:07,780
Sappiamo che Java è un linguaggio sicuro per tipo e in questo caso è entrato in gioco il

52
00:05:07,870 --> 00:05:15,450
controllo di sicurezza del tipo eseguito in runtime, quindi i progettisti di linguaggio desiderano risolvere questo problema ed evitare tali eccezioni di runtime.

53
00:05:15,450 --> 00:05:21,540
Volevano che tali problemi venissero identificati in fase di compilazione e così via, così hanno

54
00:05:22,660 --> 00:05:29,630
introdotto la funzione genetica che non genera un concetto di tempo puramente compilativo che non esiste un runtime impostato.

55
00:05:30,010 --> 00:05:36,630
Viene solo in gioco compilato da e qui è lo stesso codice in cui vengono utilizzati i generici.

56
00:05:36,800 --> 00:05:42,020
L'oggetto qui è sostituito da qualcosa chiamato parametro type e ne discuteremo più tardi.

57
00:05:42,590 --> 00:05:45,080
Quindi ecco un parametro di tipo.

58
00:05:45,080 --> 00:05:50,940
Ora vediamo cosa succede a Jonathan e qui chiama John.

59
00:05:50,940 --> 00:05:59,280
John crea un'istanza di store ma afferma esplicitamente che l'istanza di archiviazione memorizzerebbe solo un'istanza di punto

60
00:05:59,310 --> 00:06:06,210
Java come ha fatto il tuo cane o una delle sue forniture ma nient'altro.

61
00:06:06,210 --> 00:06:12,930
Quindi, se si guarda la definizione della classe ha la notazione P e quando John crea l'istanza

62
00:06:13,230 --> 00:06:21,290
del negozio con ha fatto che le parentesi angolari poi fatte si applica a ogni istanza della nella definizione della classe.

63
00:06:21,570 --> 00:06:25,170
Come esattamente quello che funziona internamente è qualcosa che discuteremo più avanti.

64
00:06:25,320 --> 00:06:32,840
Per ora sarebbe sufficiente capire che corrispondeva alla definizione della classe successiva nella seconda data dell'istruzione l'istanza è stata impostata

65
00:06:32,840 --> 00:06:39,210
in un secondo momento e viene recuperata usando il getter ora non che, a differenza dell'esempio

66
00:06:39,290 --> 00:06:42,710
precedente, non è possibile eseguire il casting qui.

67
00:06:43,460 --> 00:06:45,470
Quindi è un codice dall'aspetto più pulito.

68
00:06:47,050 --> 00:06:54,130
Successivo Anita tenta di impostare un'istanza di data dal nostro solito pacchetto sul compilatore che segnala istantaneamente

69
00:06:54,220 --> 00:07:02,040
che non può farlo poiché quella particolare istanza di archivio può essere analizzata solo l'istanza dal pacchetto di

70
00:07:02,080 --> 00:07:06,750
alimentazione di Jordan che è stata applicata da John scope.

71
00:07:06,830 --> 00:07:13,490
Quindi, come potete vedere dal momento che stiamo usando i generici, non vi è spazio per l'eccezione di runtime che abbiamo

72
00:07:13,490 --> 00:07:17,580
visto nell'esempio precedente in cui la classe dell'oggetto era usata come tipo.

73
00:07:18,200 --> 00:07:21,920
Quindi questo è il tipo di sicurezza al momento della compilazione stesso.

74
00:07:21,920 --> 00:07:28,190
Questo è davvero interessante, in quanto è sempre meglio sapere come è stato rilevato in fase di compilazione, in quanto non si desidera che il

75
00:07:28,190 --> 00:07:32,150
programma smetta di funzionare in fase di esecuzione a causa di un errore di runtime.

76
00:07:34,300 --> 00:07:41,230
Infine, poiché viene utilizzata la generica, viene di nuovo istanziata la stessa classe di archivio, ma

77
00:07:41,260 --> 00:07:49,950
questa volta conterrà un'istanza di libro che è completamente diversa dall'istanza di data, quindi con i generici otteniamo il vantaggio

78
00:07:49,950 --> 00:07:53,510
dalla sicurezza del tipo all'eccezione della compilazione.

79
00:07:53,730 --> 00:07:55,570
Questo è il principale vantaggio.

80
00:07:55,810 --> 00:07:58,040
Ora hai dimenticato la sicurezza del tipo.

81
00:07:58,050 --> 00:08:05,460
Si prega di fare riferimento al tipo conferenza di sicurezza che faceva parte di uno dei gruppi capitolo secondo

82
00:08:05,460 --> 00:08:13,820
beneficio è il codice dall'aspetto più pulito in quanto non esiste un typecasting esplicito come nell'esempio precedente il terzo vantaggio è che

83
00:08:13,940 --> 00:08:16,650
il codice è molto più esplicito.

84
00:08:16,700 --> 00:08:23,160
Ad esempio qui lo sviluppatore afferma esplicitamente quale tipo di oggetto è archiviato istanza quale archivio.

85
00:08:23,990 --> 00:08:30,970
Va bene che anche l'espressività è molto importante, ecco perché il nome indica che il codice è generico.

86
00:08:30,970 --> 00:08:37,400
Ad esempio qui il codice cliente è in grado di creare un'istanza di paglia che potrebbe chiamare qualsiasi.

87
00:08:37,950 --> 00:08:44,560
Il primo John sta creando un'istanza di negozio chiamata il codice chiamato mentre Raj sta creando un'altra istanza di negozio

88
00:08:44,800 --> 00:08:46,740
che terrebbe un oggetto libro.

89
00:08:47,470 --> 00:08:54,650
Quindi il potere giace ma il codice gentile del codice Klein può trasmettere tutto ciò che desiderano in termini di genericità.

90
00:08:54,690 --> 00:09:01,140
È molto simile all'uso di un oggetto come tipo ma al vantaggio della sicurezza del tipo a tempo di compilazione.

91
00:09:02,010 --> 00:09:08,430
Ecco perché il codice generico è stato introdotto in Java per ridurre gli errori di runtime garantendo la sicurezza del tipo

92
00:09:08,430 --> 00:09:10,260
al momento della compilazione stesso.

93
00:09:11,580 --> 00:09:16,820
No, quel framework di collezioni usa un bel po 'di genetica come abbiamo visto prima.

94
00:09:18,690 --> 00:09:22,280
Ora esaminiamo molto rapidamente l'agenda di questo capitolo.

95
00:09:22,290 --> 00:09:31,160
Inizieremo osservando la sintassi della genetica selvatica a prescindere dalle classi sulle interfacce, la genetica può

96
00:09:31,160 --> 00:09:40,160
essere associata solo a metodi con metodi meno genetici, quindi vedremo una proprietà della genetica chiamata in

97
00:09:40,160 --> 00:09:44,610
radianti che è necessaria per garantire la sicurezza.

98
00:09:45,110 --> 00:09:47,990
È un argomento molto importante

99
00:09:48,000 --> 00:09:49,920
Successivamente vedremo i caratteri jolly.

100
00:09:50,070 --> 00:09:59,170
Ora, se vogliamo costruire librerie ampiamente utilizzate, è fondamentale utilizzare correttamente i caratteri jolly.

101
00:09:59,170 --> 00:10:06,760
Di seguito vedremo un'altra caratteristica del compilatore chiamata cancellazione dei tipi che aiuta il punteggio generico a

102
00:10:06,880 --> 00:10:11,610
interagire con il codice Java precedente che non utilizza genera.

103
00:10:11,890 --> 00:10:18,120
Si noti che i generici sono stati introdotti quasi 10 anni dopo il rilascio della prima versione di Java.

104
00:10:18,880 --> 00:10:20,970
Quindi ci può essere molto codice legacy.

105
00:10:21,100 --> 00:10:25,350
Un nuovo programma dovrebbe essere in grado di lavorare con loro senza problemi.

106
00:10:27,040 --> 00:10:33,720
Successivamente vedremo anche alcune restrizioni che abbiamo con l'uso di generici.

107
00:10:33,730 --> 00:10:40,260
Ovviamente guarderemo molto codice e estenderemo il progetto anche in questo capitolo.

108
00:10:40,270 --> 00:10:44,280
Infine esamineremo anche alcune richieste di Java interessato.

109
00:10:44,650 --> 00:10:47,870
Quindi questo è ciò che studieremo nel capitolo.

110
00:10:47,950 --> 00:10:55,380
Basta notare che molti sviluppatori in generale trovano i generici che confondono di non avere problemi a utilizzarli leggendo le

111
00:10:55,380 --> 00:10:58,530
classi del framework delle raccolte che sono semplici.

112
00:10:58,930 --> 00:11:02,970
Ma oltre a questo tendono a mancare di chiarezza.

113
00:11:03,010 --> 00:11:10,950
Una ragione per questo non sono molte risorse che spiegano questo argomento molto bene, un'altra ragione è che questi

114
00:11:11,250 --> 00:11:18,600
sviluppatori, chiunque stia cercando di imparare, probabilmente non sta facendo abbastanza per impararlo mentre i generici richiedono

115
00:11:18,600 --> 00:11:20,720
qualche sforzo in più.

116
00:11:20,880 --> 00:11:23,220
Ma il concetto stesso è piuttosto semplice.

117
00:11:23,940 --> 00:11:27,460
Una volta che lo hai capito concettualmente, sembra molto semplice.

118
00:11:28,380 --> 00:11:34,560
Considerando quello che ho appena detto molto è stato pensato per costruire questo capitolo, è venuto fuori

119
00:11:34,560 --> 00:11:38,770
piuttosto bene ed è stato accolto molto bene da molti studenti.

120
00:11:38,880 --> 00:11:46,050
Gli studenti che hanno familiarità con i generici ma non sono ancora chiari mi hanno informato che questo capitolo

121
00:11:46,050 --> 00:11:47,940
li ha aiutati immensamente.

122
00:11:47,940 --> 00:11:54,680
Il mio consiglio per questo capitolo non è quello di correre attraverso le lezioni, ma lentamente e

123
00:11:54,680 --> 00:12:01,330
farlo bene e una volta che hai finito una lezione o qualche argomento fai un po 'di

124
00:12:02,350 --> 00:12:09,430
brainstorming per assicurarti di avere un concetto anche dopo aver finito il capitolo probabilmente una volta ogni settimana

125
00:12:09,430 --> 00:12:16,450
o due settimane provate a pensare a tutti i diversi concetti e quella visualizzazione dovrebbe essere davvero utile

126
00:12:16,630 --> 00:12:18,850
per interiorizzare completamente questo concetto.

127
00:12:18,850 --> 00:12:23,290
Quindi lasciatemi fermarsi qui e ora andiamo avanti e cominciamo con il capitolo.

128
00:12:23,290 --> 00:12:23,740
Grazie.
