มีบางสถานการณ์ที่เมธอดและคลาสจะต้องไม่ขึ้นอยู่กับชนิดข้อมูลที่จะรับมาดำเนินการ ตัวอย่างเช่น โปรแกรมในการค้นหาสมาชิกในอาร์เรย์จะค้องสามารถประมวลผลสมาชิกที่อาจจะเป็น สตริง จำนวนเต็ม หรือคลาสที่กำหนดเองได้ และไม่สำคัญว่าสมาชิกของอาเรย์จะเป็นชนิดของข้อมูลแบบใดวิธีการใช้งานจะต้องเหมือนกันเสมอ แน่นอนว่าเราไม่สามารถเขียนเมธอดเพื่อรองรับข้อมูลทุกชนิดได้เพราะมันต้องการพารามิเตอร์ที่แตกต่างกัน

ภาษาจาวาตั้งแต่เวอร์ชัน 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<>(…);