Desde que escuché sobre la inferencia de tipos (en Haskell), viví con la impresión de que Java es exactamente lo contrario, es decir, no tiene ninguna inferencia de tipo. Recientemente, tuve un momento increíble y me di cuenta de que Java emplea la inferencia de tipo en su implementación de genéricos.Tipo de inferencia en Java (à la C#)
Luego, leí dos artículos de Gilad Bracha (una de las personas detrás de la implementación de genéricos en Java, por lo que yo entiendo). El primer documento es un tutorial about generics (PDF), en el que dice explícitamente que el compilador inferirá el argumento de tipo real utilizado para reemplazar el parámetro de tipo de formato. Entonces, hay inferencia de tipo en Java, pero ¿por qué solo para los genéricos, por qué no algo como la palabra clave var
de C#? Y esta es mi pregunta para ti.
¿Por qué Java no tiene más inferencias de tipo integradas en el compilador?
Voy a sugerir una respuesta, y esto está relacionado con el segundo documento que leí, Pluggable Type Systems (PDF). Parece, Gilad Bracha cree que la parte de inferencia no debe ser parte del compilador, pero una característica IDE o similar (sección 4, párrafo 6 en el documento mencionado anteriormente):
Un mejor enfoque de ingeniería es implementar la inferencia de tipo como una herramienta independiente , disponible en el IDE. Los programadores que encuentran que ingresar el tipo de anotaciones tediosas pueden invocar un inferencer bajo demanda.
¿Qué opinas?
Es interesante utilizar la palabra clave ** var ** como ejemplo: cuando se usa con tipos anónimos de C#, proporciona un claro ejemplo de inferencia de tipo que sería imposible sin incluir en el compilador. –
@Kirk - No veo cómo la inferencia de tipo para 'var' tendría que hornearse en el compilador. Muchos lenguajes dinámicos le permiten hacer algo como los tipos anónimos de C# (por ejemplo, JavaScript). El sistema de tipo conectable tendría acceso al código fuente, por lo que podría inferir algo así como un tipo anónimo ... (y verificar la estructura del mismo, porque no tiene un nombre) –
@Tomas, Javascript no está tipeado estáticamente ni un lenguaje compilado por lo que su comparación está fuera de lugar. –