มีบางสถานการณ์ที่เมธอดและคลาสจะต้องไม่ขึ้นอยู่กับชนิดข้อมูลที่จะรับมาดำเนินการ ตัวอย่างเช่น โปรแกรมในการค้นหาสมาชิกในอาร์เรย์จะค้องสามารถประมวลผลสมาชิกที่อาจจะเป็น สตริง จำนวนเต็ม หรือคลาสที่กำหนดเองได้ และไม่สำคัญว่าสมาชิกของอาเรย์จะเป็นชนิดของข้อมูลแบบใดวิธีการใช้งานจะต้องเหมือนกันเสมอ แน่นอนว่าเราไม่สามารถเขียนเมธอดเพื่อรองรับข้อมูลทุกชนิดได้เพราะมันต้องการพารามิเตอร์ที่แตกต่างกัน
ภาษาจาวาตั้งแต่เวอร์ชัน 5 เป็นต้นมารองรับการเขียนโปรแกรมแบบ generic ซึ่งเป็นการเขียนโปรแกรมที่มีการประมวลผลข้อมูลในเชิง abstract คือสนใจวิธีการมากกว่าชนิดของข้อมูล การเขียนโปรแกรมแบบ generic คือ การที่เมธอดและคลาสสามารถดำเนินการกับชนิดของข้อมูลที่แตกต่างกันได้ด้วยวิธีการเดียวกัน ซึ่งชนิดของข้อมูลจะถูกระบุก็ต่อเมื่อมีการสร้างออบเจกต์ขึ้นมาหรือเมื่อมีการเรียกใช้งานเมธอดเท่านั้น แนวคิดการเขียนโปรแกรมแบบ generic ทำให้เราสามารถสร้างโปรแกรมที่ยืดหยุ่นและถูกนำมาใช้ซ้ำได้ง่ายขึ้น
คลาสที่เป็น generic คือคลาสที่มีการกำหนดให้รองรับพารามิเตอร์ โดยเราประกาศคลาสในรูปแบบ class GenericType<T> ซึ่ง พารามอเตอร์ T หมายถึงการไม่ได้ระบุชนิดของข้อมูลที่คลาสจะรับมาดำเนินการ(อะไรก็ได้) และสำหรับฟิลด์และเมธอดในคลาสก็จะถูกประกาศโดยอ้างอิงพารามอเตอร์ T เช่นเดียวกัน เราอาจจะมองว่า T เป็นชนิดของข้อมูลแบบนึงก็ได้ ตัวอย่างเช่น
class GenericType<T> {
/**
* เป็นการประกาศฟิลด์แบบไม่ระบุชนิดของข้อมูล
*/
private T t;
/**
* เป็นการประกาศว่าเมธอดรับพารามิเตอร์แต่ไม่ระบุชนิดของข้อมูล และกำหนดค่าให้กับฟิลด์ ซึ่งก็จะทำได้เพราะฟิลด์ก็ถูกประกาศในแบบเดียวกัน
*/
public GenericType(T t) {
this.t = t;
}
/**
* ข้อมูลสามารถถูกส่งกลับไปยังโปรแกรมที่เรียกมาโดยไม่ระบุชนิดของข้อมูล
*/
public T get() {
return t;
}
/**
* การรับข้อมูล กำหนดค่า และส่งค่ากลับ โดยไม่ระบุชนิดของข้อมูล
*/
public T set(T t) {
this.t = t;
return this.t;
}
}
เวลาใช้งานคลาส generic เราจะระบุชนิดของข้อมูลในขั้นตอนการสร้างออบเจกต์ เช่น
GenericType<Integer> obj1 = new GenericType<>(10);
GenericType<String> obj2 = new GenericType<>(“abc”);
จากตัวอย่างจะเห็นความเป็น generic ที่ชัดเจนคือคลาสเดียวกันแต่สาสมารถระบุชนิดของข้อมูลที่แตกต่างกัน ทางด้านขวาของเครืองหมาย = จะเห็นว่าเราไม่ต้องระบุชนิดของข้อมูลโดยสามารถปล่อยเป็น <> ซึ่งความสามารถนี้มีมาตั้งแต่จาวาเวอร์ชั่น 7 และ <> เรียกว่าตัวดำเนินการ diamon สิ่งสำคัญคือชนิดของข้อมูลที่จะใช้กับ generic จะต้องเป็น reference type เท่านั้น ชนิดข้อมูล primitive type ใช้กับ generic ไม่ได้
บางครั้งการประกาศตัวแปรแบบ generic อาจยาวและอ่านยาก เราสามารถเขียนแทนด้วย var ซึ่งภาษาจาวาจะกำหนดชนิดของข้อมูลตามชนิดของข้อมูลที่ระบุไว้แทน ตัวอย่างเช่น
var obj3 = new GenericType<>(“abc”);
เมื่อเราประกาศตัวแปรออบเจกต์แล้ว เราสามารถเอาตัวแปรไปใช้ได้ตามชนิดของข้อมูลนั้นๆ เช่น
GenericType<Integer> obj1 = new GenericType<>(10);
GenericType<String> obj2 = new GenericType<>(“abc”);
Integer number = obj1.get(); // 10
String string = obj2.get(); // “abc”
ถ้าคลาสเรารองรับชนิดของข้อมูลหลายแบบ เราสามารถประกาศทั้งหมดตอนสร้างออบเจกต์ได้ดังนี้
GenericType<Type1, Type2, …, TypeN> obj = new GenericType<>(…);