Pergunta

Com o risco de se tornar o idiota da aldeia, alguém pode me explicar por que os genéricos são chamados genéricos? Eu entendo sua utilização e benefícios, mas se o definição de genérico é "geral" e coleções genéricas são tipo seguro, então por que não é este um equívoco?

Por exemplo, um ArrayList pode conter qualquer coisa que é um objeto:

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

enquanto uma coleção genérica do tipo string só pode conter strings:

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

Eu estou simplesmente não limpar sobre por que ele é chamado de "genérico". Se a resposta é "... o que torna possível criar classes e métodos que adiar a especificação de um ou mais tipos até que a classe ou método é declarado e instanciado por código do cliente." de aqui , então eu suponho que faz sentido. Talvez eu estou tendo este lapso mental, porque eu só começou a programar após Java introduziu os genéricos, para que eu não me lembro de um tempo antes de eles. Mas ainda ...

Qualquer ajuda é apreciada.

Foi útil?

Solução

"genérico" está falando sobre a implementação. Você escreve uma única implementação lista "genérico" que funciona com qualquer tipo, em vez de ter de implementações específicas de escrita para cada tipo que você deseja usar.

Outras dicas

Eu acho que a resposta certa para perguntas como esta é quase sempre "razões históricas, a maioria". Genéricos poderia muito bem ter sido chamado de "esquemas" ou "classes" ou "Tipo famílias" ou "gêneros" ou "funções do tipo" ou "estática" ou "tipos de gregos" ou qualquer um dos um milhão de outras coisas. Há muito tempo alguém decidiu usar a palavra "genérica", e ele ficou preso.

"genérico" nas datas dos sentidos Java para trás pelo menos até meados da década de 1970. O Departamento de Defesa dos EUA foi aperfeiçoar um documento de requisitos para a sua nova linguagem de programação (que se tornaria ADA). Um rascunho inicial ( "Woodenman" , agosto de 1975) diz:

parâmetros de tempo de compilação são necessários em linguagens extensíveis para permitir a especificação de procedimentos genéricos e estruturas de dados, tais como pilhas e filas sem repetir a definição para cada tipo de elemento.

Este é o único uso de "genérico" no documento. Não é claro para mim como se pretendia. Mas por volta de 1977 de julho ( "Tinman" ) houve uma parágrafo inteiro sobre os genéricos, e o termo veio claramente para algo específico média:

12D. GENÉRICO DEFINIÇÕES

Deve ser possível definir funções, procedimentos e tipos com parâmetros que são instanciados durante a tradução em cada chamada. Tais parâmetros podem ser qualquer identificador definido (incluindo aqueles para as variáveis, funções ou tipos), uma expressão, ou uma instrução. Esses parâmetros, como todos os outros parâmetros, deve ser avaliada no contexto da chamada.

Em junho de 1978 ( "Steelman" ) foi estabelecido jargão ; havia outros usos do termo "genérico" em outras seções do documento, referindo-se claramente a esta característica. Na linguagem acabado, generic era uma palavra reservada.

Os autores destes documentos estão listados no site, e, presumivelmente, mais ainda estão por aí. Seria pura para chamá-los e perguntar o que eles se lembram.


O uso mais antigo plausivelmente relacionado de "genérico" Eu encontrei na academia estava em = "http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.67.5276" rel Robin Milner do "a teoria do tipo de polimorfismo na programação" (1978) (e ele se sente compelido a explicar o que ele quer dizer com "genérico", por isso não pode ter sido de uso comum na academia em que tempo):

Então este é o tipo genérico de Mapa , ou seja, a qualquer ocorrência de Mapa no âmbito desta declaração deve ser atribuída alguma instância substituição deste tipo.

"tipo genérico variável" tornou-se CS jargão.

bool Equals(int x, int y)

O método acima só pode comparar números inteiros, por isso podemos dizer que é especializada para comparar inteiros.

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

O método acima pode comparar valores de qualquer tipo, por isso podemos dizer que não é especializada para qualquer tipo particular. - É genérico

Eu não quero entrar em semântica da linguagem (Inglês, não java), e com o risco de responder-lhe com uma tautologia; um método genérico é chamado porque genérico, como você disse, o seu pode ser usado no sentido geral, ele não tem um tipo específico, ele pode ser usado geralmente

Ok, tome isso com um grão de sal, porque eu sou totalmente adivinhar, mas eu me pergunto se não seria um abastardamento da "Tipos Generative".

Conceitualmente, quando você se especializar uma lista em um List , ele gera um novo tipo. Pelo menos, essa é a forma como ele funciona em modelos C ++ e C # genéricos.

Em Java, uma vez que as parametrizações são descartados pelo compilador usando o tipo de apagamento, que realmente não gerar um novo tipo especializado, então quem sabe?

Eu suponho que você poderia dizer que implementa Java uma versão genericized de tipos de geradores:)


ON EDIT:

Aqui está outro ponto de vista ...

A Lista de tipo não é o que eles estão falando quando se referem a um tipo de "genérico". Eu acho que a terminologia é realmente referindo-se à List tipo, que é como existe o tipo em sua forma genérica. List é uma especialização da lista genérica .

Se eles chamam de "tipo de parâmetro (s)" as pessoas se confundem com parâmetros do tipo Type.

Além disso, ArrayList não é "genérico". Ele só funciona com tipos de objeto. Se você perguntar para algo, ele vai te dar uma referência de objeto. Isso é um comportamento muito específico.

Uma classe que leva objetos não é genérico, é muito especificamente tendo um tipo que se um tipo genérico é. A classe genérica, por outro lado, pode ser usado com qualquer tipo específico.

Porque você está criando código "genérico", que será capaz de operar em qualquer tipo (dentro das restrições que você especificar) da mesma forma ...

um bom exemplo você está familiarizado com o operador add é apenas sobre qualquer língua ... ele pode "Adicionar" inteiros, floats, doubles, decimais, binarys, hexadecimais, independentemente de serem assinados, unsogned, quantas pedaços que são, etc ...

Eu não sou um "nativo" Inglês Speaker, para que eu pudesse estar errado, mas o ponto do "genéricos" é que a tipos genéricos Definir, não é?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top