Di setiap rilis Java versi baru, akan selalu diikuti dengan adanya penambahan dan peningkatan dari bahasa tersebut. Penambahan dapat berupa adanya fitur-fitur baru (kelas-kelas atau interfes Java baru) di API Java dan peningkatan pada sintaksis bahasa (language sintax). Dari sisi sintaksis bahasa, peningkatan yang cukup siknifikan di Java SE 7 adalah penggunaan tipe-tipe generik (generic types).

Deklarasi metoda generik.

Maksud utama fitur generik di Java adalah untuk keamanan tipe (type safety). Interfes, kelas, konstruktor dan metoda yang dideklarasikan generik harus menggunakan pamameter tipe (type parameter). Parameter tipe adalah placeholder untuk tipe sesungguhnya. Parameter tipe hanya bekerja untuk tipe acuan (variabel dengan tipe interfes atau kelas Java). Berikut ini adalah sintak pendeklarasian metoda generik.

penentu <T> tipe-nilai-dikembalikan nama-metoda(daftar-parameter) {
   // deklarasi dan pernyataan
}

T di dalam kurung sudut adalah parameter tipe. Parameter tipe di metoda generik bersifat lokal, artinya cakupannya dimulai dari posisi dimana parameter tipe dideklarasikan dan berlanjut sampai akhir dari blok metoda generik. Sebagai contoh, berikut ini adalah deklarasi metoda generik cetakNilai yang tidak mengembalikan nilai (return value):

public static <T> void printNilai(T nilai) {
   System.out.println(“Nilai : ” + nilai);
}

Sebuah metoda generik, selain menjadi bagian dari kelas generik (generik class) juga dapat menjadi bagian dari kelas biasa (ordinary class). Semua deklarasi metoda generik mempunyai bagian parameter tipe (type parameter section) yang diletakkan di dalam tanda kurung sudut (< >) sebelum tipe-nilai-dikembalikan. Setiap bagian parameter tipe dapat berisi satu atau lebih parameter tipe (disebut juga type variable) yang dipisah koma. Parameter tipe dapat digunakan sebagai tipe nilai yang dikembalikan oleh metoda generik dan juga sebagai placeholder untuk tipe argumen yang diberikan ke metoda generik. Metoda generik juga dapat memiliki tipe parameter lain selain parameter tipe dari kelasnya.

Secara kaidah, nama-nama parameter tipe adalah karakter huruf besar tunggal apa saja. Mengabaikan kaidah penamaan untuk parameter tipe akan menyulitkan dalam membedakannya dengan nama-nama variabel dan kelas. Nama-nama parameter tipe yang paling umum digunakan adalah E (element), K (key), T (type), N (number), V (value), S, U, V dan sebagainya.

Motivasi untuk metoda generik.

Di metoda generik, parameter tipe (misalnya T) dapat digunakan sebagai tipe umum (generic type) untuk parameter metoda. Ketika sebuah kelas mendeklarasikan berulang-ulang metoda dengan nama sama tetapi dengan parameter berbeda (overloading method), metoda-metoda tersebut dapat diwakili oleh satu metoda generik dengan T sebagai tipe parameter yang akan mewakili tipe-tipe parameter dari semua metoda.

Dua contoh program berikut adalah program serupa dimana yang satu menggunakan overloading method dan yang lain menggunakan metoda generik. Berikut ini adalah kode program untuk mencetak nilai-nilai tipe berbeda yang tersimpan di beberapa variabel menggunakan overloading method. File kode program disimpan di direktori c:\hindro\javasc dengan nama PrintNilai.java.

// Nama file : PrintNilai. java
// Mencetak berbagai tipe nilai

// Deklarasi kelas
public class PrintNilai {
   
   // Metoda main
   public static void main(String[] args) {

      // Deklarasi dan pemberian nilai awal ke variabel
      Integer varInt = 8652339;
      Double varDouble = 96342.7656;
      Character varChar = 'H';
      String varString = "Belajar Java.";

      System.out.println();
      System.out.println("Nilai-nilai yang dicetak:");

      // Memanggil overloading metoda print
      print(varInt);
      print(varDouble);
      print(varChar);
      print(varString);         
   }

   // Metoda print untuk mencetak nilai tipe long
   public static void print(Integer nilaiInteger) {
      System.out.println(nilaiInteger);
   }

   // Metoda print untuk mencetak nilai tipe double
   public static void print(Double nilaiDouble) {
      System.out.println(nilaiDouble);
   }

   // Metoda print untuk mencetak nilai tipe char
   public static void print(Character nilaiChar) {
      System.out.println(nilaiChar);
   }

   // Metoda print untuk mencetak nilai tipe String
   public static void print(String nilaiString) {
      System.out.println(nilaiString);
   }
}

Di artikel Konversi Data Dari String Ke Tipe-Tipe Numerik, Anda telah diperkenalkan dengan numeric wrapper class. Numeric wrapper class digunakan untuk memanipulasi tipe-tipe numerik primitif (byte, short, int, long, float dan double) sebagai obyek. Selain numeric wrapper class, tipe data primitif lain yang memiliki type wrapper class adalah char dan boolean. Untuk tipe char dan boolean, type wrapper class adalah Character dan Boolean. Di Java, Byte, Short, Integer, Long, Float, Double, Character dan Boolean adalah kelas-kelas Java yang terletak di paket java.lang.

Baris nomor 11 – 14 adalah deklarasi variabel dengan tipe Integer, Double, Character dan String. Masing-masing variabel yang dideklarasikan langsung diberi nilai dalam bentuk literal numerik, karakter dan string. Literal numerik dan karakter langsung dapat diberikan ke variabel-variabel yang menggunakan tipe-tipe wrapper class karena adanya konversi otomatis yang disebut outoboxing. Outoboxing adalah konversi otomatis oleh kompiler Java dari tipe data primitif ke type wrapper class yang bersesuaian, sedangkan outo-unboxing adalah konversi otomatis oleh kompiler Java dari type wrapper class ke tipe data primitif yang bersesuaian. Outoboxing dan auto-unboxing mulai diperkenalkan di Java 5.0.

Baris nomor 20 – 23 adalah pernyataan untuk memanggil overloading method print. Di setiap pemanggilan metoda print, kompiler Java akan menentukan secara otomatis metoda mana yang paling spesifik digunakan berdasarkan nama metoda dan parameter yang sesuai dengan tipe argumen yang diberikan. Sebagai contoh, untuk metoda print(varInt), kompiler akan memanggil metoda yang dideklarasikan di baris nomor 28 – 30 karena paling spesifik (argumen yang diberikan, varInt, sesuai dengan tipe parameter metoda yaitu Integer) dibandingkan dengan tiga deklarasi metoda yang lain.

Baris nomor 28, 33, 38 dan 43 adalah pernyataan untuk menampilkan nilai. Ada perbedaan dalam menampilkan nilai yang tersimpan di variabel tipe-tipe primitif dan variabel tipe-tipe kelas. Untuk variabel tipe-tipe primitif, nilai yang tersimpan langsung ditampilkan, sedangkan untuk variabel tipe-tipe kelas, string yang merupakan representasi obyek yang ditampilkan. Kelas Object berada di puncak teratas dalam hirarkhi turunan kelas di Java. Lansung maupun tidak langsung, semua kelas merupakan turunan kelas Object. Kelas turunan akan mewarisi metoda-metoda yang dimiliki oleh kelas Object, termasuk disini metoda spesial toString. Untuk menampilkan nilai yang merupakan representasi obyek sebuah kelas, metode toString bisa disertakan dan bisa juga tidak. Metode toString akan dibahas lebih lanjut di bab berikutnya.

Berikut ini adalah penyederhanaan dari contoh kode program sebelumnya dengan menggunakan satu metoda generik. Tipe parameter dari overloading method di contoh kode program sebelumnya dapat diwakili oleh tipe parameter umum misalnya T. Contoh kode program GenericPrintNilai akan mencetak nilai-nilai dari tipe berbeda yang tersimpan di beberapa variabel menggunakan metoda generik. File program disimpan di direktori c:\hindro\javasc dengan nama GenericPrintNilai.java.

// Nama file : GenericPrintNilai. java
// Mencetak berbagai tipe nilai

// Deklarasi kelas
public class GenericPrintNilai {
   
   // Metoda main
   public static void main(String[] args) {

      // Deklarasi dan pemberian nilai awal ke variabel
      Integer varInt = 8652339;
      Double varDouble = 96342.7656;
      Character varChar = 'H';
      String varString = "Belajar Java.";

      System.out.println();
      System.out.println("Nilai-nilai yang dicetak:");

      // Memanggil generic method print
      print(varInt);
      print(varDouble);
      print(varChar);
      print(varString);         
   }

   // Generic method untuk mencetak nilai berbegai tipe 
   public static  void print(T nilai) {
      System.out.println(nilai);
   }
}

Baris nomor 27 – 29 adalah deklarasi metoda generik print yang mewakili overloading method print di contoh program sebelumnya (program PrintNilai). T yang terletak di dalam kurung sudut adalah parameter tipe. Parameter tipe hanya bekerja untuk tipe acuan (variabel yang dideklarasikan dengan tipe interfes dan kelas Java) dan tidak bisa untuk tipe-tipe primitif. Di deklarasi metoda generik print, parameter tipe T juga digunakan sebagai tipe parameter metoda nilai. Karena T hanya bekerja untuk tipe acuan, maka argumen untuk parameter metoda bisa berupa variabel-variabel dengan tipe-tipe kelas termasuk disini kelas Byte, Short, Integer, Long, Float, Double, Character dan Boolean.

Ketika metoda print dengan tipe parameter berdeda (baris nomor 20 – 23) dipanggil, program akan menggunakan satu metoda generik print untuk mewakili semua panggilan metoda tersebut. Parameter metoda generik nilai tipe T dapat menerima nilai variabel varInt, varDouble, varChar dan varString yang dideklarasikan dengan tipe kelas Integer, Double, Character dan String. Karena variabel varInt, varDouble, varChar dan varString yang diberikan ke metoda print sebagai argumen dari parameter metoda generik adalah dari tipe acuan (tipe dari kelas-kelas Java), maka nilai yang ditampilkan adalah string yang merupakan representasi obyek dari kelas Integer, Double, Character dan String.