Domanda

A rischio di diventare lo scemo del villaggio, qualcuno può spiegarmi perché i generici si chiamano generici?Comprendo il loro utilizzo e i vantaggi, ma se il file definizione di generico è "generale" e le raccolte generiche sono sicure, allora perché non è un termine improprio?

Ad esempio, un ArrayList può contenere tutto ciò che è un oggetto:

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

mentre una raccolta generica di tipo stringa può contenere solo stringhe:

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

Non mi è chiaro il motivo per cui si chiama "generico".Se la risposta è "... che consente di progettare classi e metodi che differiscono la specifica di uno o più tipi fino a quando la classe o il metodo non viene dichiarata e istanziata dal codice client." da Qui, allora suppongo che abbia senso.Forse sto avendo questo errore mentale perché ho iniziato a programmare solo dopo che Java ha introdotto i generici, quindi non ricordo un periodo prima di loro.Ma ancora...

Qualsiasi aiuto è apprezzato.

È stato utile?

Soluzione

&

quot; quot Generico &; sta parlando dell'implementazione. Scrivi una sola & Quot; Generica & Quot; elenca l'implementazione che funziona con qualsiasi tipo, invece di dover scrivere implementazioni specifiche per ogni tipo che desideri utilizzare.

Altri suggerimenti

Penso che la risposta giusta a domande come questa sia quasi sempre "ragioni storiche, soprattutto".I generici avrebbero potuto anche essere chiamati "schemi" o "classi" o "famiglie di tipi" o "generi" o "funzioni di tipo" o "statici" o "tipi greci" o qualsiasi altro milione di cose.Molto tempo fa qualcuno decise di usare la parola "generico", e rimase.

Il termine "generico" nel senso Java risale almeno alla metà degli anni '70.Gli Stati Uniti.Il Dipartimento della Difesa stava mettendo a punto un documento sui requisiti per il suo nuovo linguaggio di programmazione (quello che sarebbe diventato ADA).Una prima bozza ("Uomo di legno", agosto 1975) dice:

I parametri in fase di compilazione sono necessari nei linguaggi estensibili per consentire la specifica di procedure generiche e strutture dati come stack e code senza ripetere la definizione per ciascun tipo di elemento.

Questo è l'unico uso del termine "generico" nel documento.Non mi è chiaro come fosse inteso.Ma nel luglio 1977 ("Uomo di latta") c'era un intero paragrafo sui farmaci generici e il termine aveva chiaramente assunto un significato specifico:

12D.DEFINIZIONI GENERICHE

Sarà possibile definire funzioni, procedure e tipologie con parametri istanziati durante la traduzione ad ogni chiamata.Tali parametri possono essere qualsiasi identificatore definito (compresi quelli per variabili, funzioni o tipi), un'espressione o un'istruzione.Questi parametri, come tutti gli altri parametri, saranno valutati nel contesto del bando.

Entro giugno 1978 ("Uomo d'Acciaio") è stato stabilito il gergo;vi sono stati altri usi del termine “generico” in altre sezioni del documento, chiaramente riferiti a questa caratteristica.Nella lingua finita, generic era una parola riservata.

Gli autori di questi documenti sono elencati sul sito e presumibilmente la maggior parte è ancora in circolazione.Sarebbe carino chiamarli e chiedere cosa ricordano.


Il primo uso plausibilmente correlato di "generico" che ho trovato nel mondo accademico è stato in quello di Robin Milner "Una teoria del polimorfismo dei tipi nella programmazione" (1978) (e si sente obbligato a spiegare cosa intende per "generico", quindi non può essere stato di uso comune nel mondo accademico in quel momento):

Quindi questo è il tipo generico di carta geografica, cioè a qualsiasi occorrenza di carta geografica nell'ambito di questa dichiarazione deve essere assegnata qualche istanza di sostituzione di questo tipo.

"Variabile di tipo generico" è diventato il gergo CS.

bool Equals(int x, int y)

Il metodo sopra può confrontare solo numeri interi, quindi possiamo dire che è specializzato per confrontare numeri interi.

bool Equals<T>(T x, T y);

Il metodo sopra può confrontare valori di qualsiasi tipo, quindi possiamo dire che non è specializzato per nessun tipo particolare - è generico .

Non voglio entrare nella semantica della lingua (inglese, non java) e rischiare di risponderti con una tautologia; un metodo generico è chiamato generico perché, come hai detto, può essere usato nel senso generale, non ha un tipo specifico, può essere usato in generale

Ok, prendilo con le pinze, perché lo sono totalmente indovinando, ma mi chiedo se non possa trattarsi di un'imbastardimento dei "Tipi Generativi".

Concettualmente, quando specializzi un List in un List< String >, genera un nuovo tipo.Almeno, questo è il modo in cui funziona nei modelli C++ e nei generici C#.

In Java, poiché le parametrizzazioni vengono scartate dal compilatore utilizzando la cancellazione del tipo, in realtà no generare un nuovo tipo specializzato, quindi chi lo sa?

Suppongo che potresti dire che Java implementa una versione generica dei tipi generativi :)


IN MODIFICA:

Ecco un altro punto di vista...

Il tipo List< String > non è ciò di cui parlano quando si riferiscono a un tipo "generico".Penso che la terminologia si riferisca effettivamente al tipo List< T >, che è il modo in cui il tipo esiste nella sua forma generica.List< String > è una specializzazione del generico List< T >.

Se lo chiamavano " tipo parametro (i) " la gente lo confonderebbe con parametri di tipo Tipo.

Inoltre, ArrayList non è " generico " ;. Funziona SOLO con tipi di oggetti. Se lo chiedi per qualcosa, ti darà un riferimento all'oggetto. È un comportamento molto specifico.

Una classe che accetta oggetti NON è generica, sta prendendo in modo molto specifico un tipo che è esso stesso un tipo generico. Una classe generica, d'altra parte, può essere utilizzata con qualsiasi tipo specifico.

Perché stai creando " Generico " codice che sarà in grado di operare su qualsiasi tipo (entro i limiti specificati) nello stesso modo ...

un buon esempio con cui hai familiarità è che l'operatore Aggiungi è praticamente in qualsiasi lingua ... può " Aggiungi " numeri interi, float, doppi, decimali, binari, esadecimali, indipendentemente dal fatto che siano firmati, non riconosciuti, quanti bit sono, ecc ...

Non sono un " nativo " Inglese, quindi potrei sbagliarmi, ma il punto del & Quot; Generics & Quot; è che i tipi Define Generics, vero?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top