Tecnicamente parlando, Java ha inferenza di tipo quando si usano i generici. Con un metodo generico come
public <T> T foo(T t) {
return t;
}
Il compilatore lo analizzerà e lo capirà quando scrivi
// String
foo("bar");
// Integer
foo(new Integer(42));
Verrà restituita una stringa per la prima chiamata e un numero intero per la seconda chiamata in base a ciò che è stato inserito come argomento. Di conseguenza, si otterrà il corretto controllo in fase di compilazione. Inoltre, in Java 7, si può ottenere qualche tipo di inferenza quando si istanziano generici in questo modo
Map<String, String> foo = new HashMap<>();
Java è abbastanza gentile da riempire le parentesi angolari vuote per noi. Ora perché Java non supporta l' inferenza del tipo come parte dell'assegnazione delle variabili? A un certo punto, c'era una RFE per l'inferenza di tipo nelle dichiarazioni di variabili, ma questa è stata chiusa come "Non risolverà" perché
Gli esseri umani beneficiano della ridondanza della dichiarazione di tipo in due modi. Innanzitutto, il tipo ridondante funge da preziosa documentazione: i lettori non devono cercare la dichiarazione di getMap () per scoprire quale tipo restituisce. In secondo luogo, la ridondanza consente al programmatore di dichiarare il tipo previsto e quindi beneficiare di un controllo incrociato eseguito dal compilatore.
Il collaboratore che ha chiuso questo ha anche notato che sembra "non-java-like", con cui sono d'accordo. La verbosità di Java può essere sia una benedizione che una maledizione, ma rende il linguaggio quello che è.
Naturalmente quel particolare RFE non era la fine di quella conversazione. Durante Java 7, questa funzionalità è stata nuovamente considerata , con alcune implementazioni di test create, tra cui una dello stesso James Gosling. Ancora una volta, questa funzionalità è stata infine eliminata.
Con il rilascio di Java 8, ora otteniamo l'inferenza del tipo come parte di lambdas in quanto tale:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Il compilatore Java è in grado di esaminare il metodo Collections#sort(List<T>, Comparator<? super T>)
e quindi l'interfaccia di Comparator#compare(T o1, T o2)
e determinarlo first
e second
dovrebbe essere un String
modo per consentire al programmatore di rinunciare a dover riformulare il tipo nell'espressione lambda.