เทคนิคการพูด Java มีประเภทอนุมานเมื่อใช้ generics ด้วยวิธีการทั่วไปเช่น
public <T> T foo(T t) {
return t;
}
คอมไพเลอร์จะวิเคราะห์และเข้าใจว่าเมื่อคุณเขียน
// String
foo("bar");
// Integer
foo(new Integer(42));
สตริงจะถูกส่งกลับสำหรับการโทรครั้งแรกและจำนวนเต็มสำหรับการโทรครั้งที่สองขึ้นอยู่กับสิ่งที่เป็นอินพุตเป็นอาร์กิวเมนต์ คุณจะได้รับการตรวจสอบคอมไพล์ตามเวลาที่เหมาะสม นอกจากนี้ใน Java 7 หนึ่งสามารถรับการอนุมานประเภทเพิ่มเติมบางอย่างเมื่อสร้างอินสแตนซ์ทั่วไปเช่นนั้น
Map<String, String> foo = new HashMap<>();
Java ใจดีพอที่จะเติมวงเล็บมุมที่ว่างสำหรับเรา ตอนนี้ทำไม Java ไม่รองรับการอนุมานประเภทเป็นส่วนหนึ่งของการกำหนดตัวแปร? จนถึงจุดหนึ่งมีRFEสำหรับการอนุมานประเภทในการประกาศตัวแปร แต่สิ่งนี้ถูกปิดเป็น "จะไม่แก้ไข" เพราะ
มนุษย์ได้รับประโยชน์จากความซ้ำซ้อนของการประกาศประเภทสองวิธี อันดับแรกประเภทที่ซ้ำซ้อนทำหน้าที่เป็นเอกสารที่มีค่า - ผู้อ่านไม่จำเป็นต้องค้นหาการประกาศของ getMap () เพื่อค้นหาประเภทที่จะส่งคืน ประการที่สองความซ้ำซ้อนช่วยให้โปรแกรมเมอร์ที่จะประกาศประเภทที่ตั้งใจและจึงได้รับประโยชน์จากการตรวจสอบข้ามดำเนินการโดยคอมไพเลอร์
ผู้มีส่วนร่วมที่ปิดสิ่งนี้ยังตั้งข้อสังเกตอีกว่ามันรู้สึก "ไม่เหมือนจาวา" ซึ่งฉันเป็นคนหนึ่งที่เห็นด้วย การใช้คำฟุ่มเฟือยของ Java สามารถเป็นได้ทั้งคำอวยพรและคำสาป แต่มันทำให้ภาษาเป็นแบบนั้น
แน่นอนว่า RFE นั้นไม่ใช่จุดสิ้นสุดของการสนทนา ระหว่าง Java 7 คุณลักษณะนี้ถูกพิจารณาอีกครั้งโดยมีการทดสอบการใช้งานบางอย่างรวมถึง James Gosling ด้วยตัวเอง อีกครั้งคุณลักษณะนี้ถูกยิงในที่สุด
ด้วยการเปิดตัว Java 8 ตอนนี้เราได้รับการอนุมานประเภทเป็นส่วนหนึ่งของ lambdas เช่น:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
คอมไพเลอร์ Java สามารถดูวิธีการCollections#sort(List<T>, Comparator<? super T>)
จากนั้นอินเทอร์เฟซของComparator#compare(T o1, T o2)
และตรวจสอบว่าfirst
และsecond
ควรจะเป็นString
ดังนั้นการอนุญาตให้โปรแกรมเมอร์ที่จะไม่ต้องปรับประเภทในการแสดงออกแลมบ์ดา