Secara teknis, Java memang memiliki tipe inferencing saat menggunakan obat generik. Dengan metode generik suka
public <T> T foo(T t) {
return t;
}
Kompiler akan menganalisis dan memahami hal itu ketika Anda menulis
// String
foo("bar");
// Integer
foo(new Integer(42));
Sebuah String akan dikembalikan untuk panggilan pertama dan Integer untuk panggilan kedua berdasarkan apa yang dimasukkan sebagai argumen. Anda akan mendapatkan waktu kompilasi yang tepat sebagai hasilnya. Selain itu, di Java 7, seseorang bisa mendapatkan beberapa tipe tambahan yang menyimpulkan ketika instantiating generik seperti itu
Map<String, String> foo = new HashMap<>();
Java cukup baik untuk mengisi kurung sudut kosong untuk kita. Sekarang mengapa Java tidak mendukung penaksiran tipe sebagai bagian dari penugasan variabel? Pada satu titik, ada RFE untuk tipe yang menyimpulkan dalam deklarasi variabel, tetapi ini ditutup sebagai "Tidak akan diperbaiki" karena
Manusia mendapat manfaat dari redundansi deklarasi tipe dalam dua cara. Pertama, tipe redundan berfungsi sebagai dokumentasi yang berharga - pembaca tidak harus mencari deklarasi getMap () untuk mengetahui tipe apa yang dikembalikan. Kedua, redundansi memungkinkan programmer untuk mendeklarasikan tipe yang dimaksud, dan karenanya mendapat manfaat dari pemeriksaan silang yang dilakukan oleh kompiler.
Kontributor yang menutup ini juga mencatat bahwa rasanya "tidak seperti java", yang saya setujui. Kata kerja Jawa bisa menjadi berkah sekaligus kutukan, tetapi itu membuat bahasa itu seperti apa adanya.
Tentu saja RFE tertentu itu bukan akhir dari percakapan itu. Selama Java 7, fitur ini sekali lagi dipertimbangkan , dengan beberapa implementasi pengujian dibuat, termasuk satu oleh James Gosling sendiri. Sekali lagi, fitur ini akhirnya ditembak jatuh.
Dengan dirilisnya Java 8, kami sekarang mendapatkan inferensi jenis sebagai bagian dari lambdas sebagai berikut:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Kompiler Java dapat melihat metode Collections#sort(List<T>, Comparator<? super T>)
dan kemudian antarmuka Comparator#compare(T o1, T o2)
dan menentukan itu first
dan second
harus dengan String
demikian memungkinkan programmer untuk melupakan harus menyatakan kembali jenis dalam ekspresi lambda.