Java - Generik

Alangkah baiknya jika kita dapat menulis metode sortir tunggal yang dapat mengurutkan elemen dalam array Integer, array String, atau array jenis apa pun yang mendukung pengurutan.

Jawa Generic metode dan kelas generik memungkinkan pemrogram untuk menentukan, dengan deklarasi metode tunggal, satu set metode terkait, atau dengan deklarasi kelas tunggal, satu set tipe terkait, masing-masing.

Generik juga menyediakan keamanan tipe waktu kompilasi yang memungkinkan pemrogram untuk menangkap tipe yang tidak valid pada waktu kompilasi.

Dengan menggunakan konsep Java Generic, kita dapat menulis metode generik untuk menyortir array objek, kemudian memanggil metode generik dengan array Integer, array ganda, array String, dan sebagainya, untuk mengurutkan elemen array.

Metode Generik

Anda bisa menulis satu deklarasi metode umum yang bisa dipanggil dengan argumen dari tipe yang berbeda. Berdasarkan tipe argumen yang diteruskan ke metode generik, compiler menangani setiap panggilan metode dengan tepat. Berikut adalah aturan untuk mendefinisikan Metode Generik -

  • Semua deklarasi metode umum memiliki bagian parameter tipe yang dipisahkan oleh tanda kurung siku (<dan>) ​​yang mendahului tipe kembalian metode (<E> dalam contoh berikutnya).

  • Setiap bagian parameter tipe berisi satu atau lebih parameter tipe yang dipisahkan dengan koma. Parameter tipe, juga dikenal sebagai variabel tipe, adalah pengenal yang menentukan nama tipe generik.

  • Parameter tipe dapat digunakan untuk mendeklarasikan tipe yang dikembalikan dan bertindak sebagai placeholder untuk tipe argumen yang diteruskan ke metode umum, yang dikenal sebagai argumen tipe aktual.

  • Tubuh metode generik dideklarasikan seperti metode lainnya. Perhatikan bahwa parameter tipe hanya dapat mewakili tipe referensi, bukan tipe primitif (seperti int, double, dan char).

Contoh

Contoh berikut mengilustrasikan bagaimana kita dapat mencetak array dari tipe yang berbeda menggunakan satu metode Generik -

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}

Ini akan menghasilkan hasil sebagai berikut -

Keluaran

Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

Parameter Jenis Terikat

Ada kalanya Anda ingin membatasi jenis jenis yang diizinkan untuk diteruskan ke parameter jenis. Misalnya, metode yang beroperasi pada bilangan mungkin hanya ingin menerima instance Bilangan atau subkelasnya. Untuk inilah parameter tipe terikat.

Untuk mendeklarasikan parameter tipe terikat, daftarkan nama parameter tipe, diikuti dengan kata kunci extends, diikuti dengan batas atasnya.

Contoh

Contoh berikut mengilustrasikan bagaimana extends digunakan dalam pengertian umum yang berarti "meluas" (seperti dalam kelas) atau "mengimplementasikan" (seperti dalam antarmuka). Contoh ini adalah metode Generik untuk mengembalikan yang terbesar dari tiga objek Comparable -

public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}

Ini akan menghasilkan hasil sebagai berikut -

Keluaran

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

Kelas Generik

Deklarasi kelas generik terlihat seperti deklarasi kelas non-generik, kecuali bahwa nama kelas diikuti oleh bagian parameter tipe.

Seperti metode generik, bagian parameter tipe dari kelas generik dapat memiliki satu atau lebih parameter tipe yang dipisahkan dengan koma. Kelas-kelas ini dikenal sebagai kelas berparameter atau tipe berparameter karena mereka menerima satu atau lebih parameter.

Contoh

Contoh berikut mengilustrasikan bagaimana kita dapat mendefinisikan kelas generik -

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}

Ini akan menghasilkan hasil sebagai berikut -

Keluaran

Integer Value :10
String Value :Hello World