Teknik olarak konuşursak, Java, jenerik kullanırken tür çıkarımı vardır . Bir ile genel yönteme gibi
public <T> T foo(T t) {
return t;
}
Derleyici yazdığınızda bunu analiz eder ve anlar.
// String
foo("bar");
// Integer
foo(new Integer(42));
Bağımsız değişken olarak neyin girildiğine bağlı olarak ilk arama için bir Dize, ikinci arama için bir Tamsayı döndürülür. Sonuç olarak uygun derleme zamanı kontrolünü alacaksınız. Ek olarak, Java 7'de, bunun gibi jenerik ilaçları başlatırken bazı ek tür çıkarımlar elde edilebilir
Map<String, String> foo = new HashMap<>();
Java bizim için boş köşeli parantezleri doldurmaya yetecek kadar naziktir. Şimdi Java neden değişken atamanın bir parçası olarak tip çıkarımını desteklemiyor ? Bir noktada, değişken bildirimlerinde tür çıkarımı için bir RFE vardı , ancak bu "düzeltmeyecek" olarak kapatıldı çünkü
İnsanlar, tip beyanının fazlalığından iki şekilde faydalanırlar. İlk olarak, gereksiz tür değerli belgeler olarak işlev görür; okuyucular, hangi türün döndürdüğünü bulmak için getMap () bildirgesini aramak zorunda değildir. İkincisi, artıklık programcının amaçlanan türü beyan etmesini ve böylece derleyici tarafından gerçekleştirilen çapraz kontrolden faydalanmasını sağlar.
Bunu kapatan katkıda bulunan, aynı zamanda hemfikir olduğum "java benzeri olmayan" bir his olduğunu da belirtti. Java'nın detaysızlığı hem bir nimettir hem de bir lanet olabilir, ancak dili olduğu gibi yapar.
Tabii ki bu belirli RFE bu konuşmanın sonu değildi. Java 7 sırasında, bu özellik, James Gosling'in kendisi de dahil olmak üzere bazı test uygulamaları oluşturularak tekrar ele alındı. Yine, bu özellik sonunda düşürüldü.
Java 8'in piyasaya sürülmesiyle birlikte, artık lambdaların bir parçası olarak tür çıkarımları alıyoruz:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Java derleyicisi, yönteme bakabiliyor Collections#sort(List<T>, Comparator<? super T>)
ve sonra bunun arayüzünü araştırabiliyor Comparator#compare(T o1, T o2)
ve belirliyor first
ve bu nedenle programcının lambda ifadesindeki türü yeniden basmak zorunda kalmasına izin verecek şekilde second
olması gerektiğini belirtmelidir String
.