Pregunta

En el riesgo de convertirse en el pueblo idiota, ¿alguien puede explicarme por qué los genéricos son llamados medicamentos genéricos?Entiendo su uso y beneficios, pero si la definición de genérico es "general" y las colecciones genéricas son de tipo seguro, entonces ¿por qué no es este un término equivocado?

Por ejemplo, un objeto ArrayList puede contener cualquier cosa que un objeto:

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

mientras que una colección genérica de tipo cadena sólo puede contener cadenas:

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

No estoy claro sobre por qué se llama "genérico".Si la respuesta es "...que hacen posible el diseño de clases y métodos que aplazar la especificación de uno o más tipos hasta la clase o método se declara y crea una instancia por código de cliente." de aquí, entonces supongo que tiene sentido.Tal vez estoy teniendo este lapso mental debido a que sólo comenzó a programación después de Java introdujeron los genéricos, por lo que no recuerdo un tiempo antes de ellos.Pero aún así...

Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución

" Genérico " está hablando de la implementación. Escribe un solo & Quot; Genérico & Quot; enumere la implementación que funciona con cualquier tipo, en lugar de tener que escribir implementaciones específicas para cada tipo que desee usar.

Otros consejos

Creo que la respuesta correcta a preguntas como esta es casi siempre "razones históricas, en su mayoría".Los medicamentos genéricos podría haber sido llamados "esquemas" o "clases" o "familias" o "géneros" o "funciones de tipo" o "estática" o "griego tipos" o cualquiera de un millón de otras cosas.Hace mucho tiempo alguien decidió utilizar el término "genérico", y se pegó.

"Genérico" en el Java sentido se remonta al menos a mediados de la década de 1970.Los estados UNIDOSEl departamento de Defensa fue perfeccionando un documento de requisitos para su nuevo lenguaje de programación (lo que sería ADA).Un primer borrador ("Woodenman", De agosto de 1975) dice:

Tiempo de compilación se necesitan parámetros de extensible idiomas para permitir la especificación de los procedimientos y estructuras de datos como las pilas y las colas sin repetir la definición de cada tipo de elemento.

Este es el único uso de "genérico" en el documento.No está claro para mí cómo era la intención.Pero en julio de 1977 ("El hombre de hojalata") hay un párrafo entero sobre los medicamentos genéricos, y el término se había llegado a significar algo concreto:

12D.GENÉRICO DEFINICIONES

Será posible definir funciones, procedimientos y tipos de parámetros que se crean instancias durante la traducción en cada llamada.Dichos parámetros pueden ser cualquier identificador definido (incluidas las variables, funciones o tipos), una expresión o una instrucción.Estos parámetros, como todos los demás parámetros, deberá ser evaluada en el contexto de la llamada.

En Junio De 1978 ("Steelman") se estableció la jerga;hay otros usos del término "genérico" en otras secciones del documento, en clara alusión a esta característica.En el lenguaje, generic era una palabra reservada.

Los autores de estos documentos se enumeran en el sitio, y, presumiblemente, la mayoría todavía están alrededor.Sería estupendo para llamarlos y preguntar que es lo que recuerde.


Los primeros plausiblemente relacionados con el uso de "genérico" que he encontrado en la academia estaba en Robin Milner del "Una teoría de tipo de polimorfismo en la programación" (1978) (y él se siente obligado a explicar lo que él entiende por "genérico", de modo que no puede haber sido de uso común en la academia en ese momento):

Así que este es el tipo genérico de mapa, que es, a la aparición de mapa en el ámbito de aplicación de la presente declaración debe ser asignado algunas sustitución instancia de este tipo.

"Genérica variable de tipo" se convirtió en CS jerga.

bool Equals(int x, int y)

El método anterior solo puede comparar enteros, por lo que podemos decir que es especializado para comparar enteros.

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

El método anterior puede comparar valores de cualquier tipo, por lo que podemos decir que no es especializado para ningún tipo en particular: es genérico .

No quiero entrar en la semántica del idioma (inglés, no java), y corro el riesgo de responderte con una tautología; un método genérico se llama genérico porque, como dijiste, se puede usar en sentido general, no tiene un tipo específico, se puede usar en general

Bien, toma esto con un grano de sal, porque estoy totally adivinando, pero me pregunto si podría ser una bastarización de " Generativo Tipos & Quot ;.

Conceptualmente, cuando especializa una Lista en una Lista < Cadena & Gt ;, genera un nuevo tipo. Al menos, así es como funciona en las plantillas de C ++ y en los genéricos de C #.

En Java, dado que el compilador descarta las parametrizaciones mediante el borrado de tipos, en realidad no < genera un nuevo tipo especializado, ¿quién sabe?

Supongo que se podría decir que Java implementa una versión genérica de tipos generativos :)


EN EDICIÓN:

Aquí hay otro punto de vista ...

El tipo Lista < Cadena & Gt; no es de lo que están hablando cuando se refieren a un " genérico " tipo. Creo que la terminología en realidad se refiere a la Lista & Lt; T & Gt; tipo, que es cómo existe el tipo en su forma genérica. Lista & Lt; Cadena & Gt; es una especialización de la lista genérica < T & Gt ;.

Si lo llamaron " escriba los parámetros " la gente lo confundiría con parámetros de tipo Tipo.

Además, ArrayList no es " genérico " ;. SOLO funciona con tipos de objetos. Si le pide algo, le dará una referencia de objeto. Ese es un comportamiento muy específico.

Una clase que toma objetos NO es genérica, está tomando muy específicamente un tipo que es en sí mismo un tipo genérico. Una clase genérica, por otro lado, se puede usar con cualquier tipo específico.

Porque estás creando " Genérico " código que podrá operar en cualquier tipo (dentro de las restricciones que especifique) de la misma manera ...

un buen ejemplo con el que está familiarizado es que el operador Agregar es casi cualquier idioma ... puede " Agregar " enteros, flotantes, dobles, decimales, binarios, hexadecimales, independientemente de si están firmados, sin registrar, cuántos bits son, etc. ...

No soy un & "; nativo &"; Habla inglés, así que podría estar equivocado, pero el punto de & Quot; Generics & Quot; es que los tipos de Definir genéricos, ¿no?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top