Java - Jenerikler

Bir Tamsayı dizisindeki, String dizisindeki veya sıralamayı destekleyen herhangi bir türden bir dizideki öğeleri sıralayabilen tek bir sıralama yöntemi yazabilirsek güzel olurdu.

Java Generic yöntemler ve genel sınıflar, programcıların sırasıyla tek bir yöntem bildirimiyle, bir dizi ilişkili yöntemi veya tek bir sınıf bildirimiyle bir dizi ilişkili türü belirtmesini sağlar.

Jenerikler ayrıca programcıların derleme zamanında geçersiz türleri yakalamasına olanak tanıyan derleme zamanı tür güvenliği sağlar.

Java Generic kavramını kullanarak, bir dizi nesneyi sıralamak için genel bir yöntem yazabiliriz, ardından dizi öğelerini sıralamak için Tamsayı dizileri, Çift diziler, Dize dizileri vb. İle genel yöntemi çağırabiliriz.

Genel Yöntemler

Farklı türlerdeki argümanlarla çağrılabilen tek bir genel yöntem bildirimi yazabilirsiniz. Genel yönteme iletilen argüman türlerine bağlı olarak, derleyici her yöntem çağrısını uygun şekilde işler. Genel Yöntemleri tanımlayan kurallar aşağıdadır -

  • Tüm genel yöntem bildirimleri, yöntemin dönüş türünden (sonraki örnekte <E>) önce gelen açılı ayraçlarla (<ve>) ayrılmış bir tür parametresi bölümüne sahiptir.

  • Her tür parametresi bölümü, virgülle ayrılmış bir veya daha fazla tür parametresi içerir. Tür değişkeni olarak da bilinen bir tür parametresi, genel bir tür adı belirten bir tanımlayıcıdır.

  • Tür parametreleri, dönüş türünü bildirmek ve gerçek tür bağımsız değişkenleri olarak bilinen genel yönteme iletilen bağımsız değişkenlerin türleri için yer tutucu görevi görmek için kullanılabilir.

  • Jenerik bir yöntemin gövdesi, diğer herhangi bir yönteminki gibi bildirilir. Tür parametrelerinin ilkel türleri (int, double ve char gibi) değil, yalnızca başvuru türlerini temsil edebileceğini unutmayın.

Misal

Aşağıdaki örnek, tek bir Genel yöntem kullanarak farklı türden bir diziyi nasıl yazdırabileceğimizi göstermektedir -

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
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

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

Sınırlı Tür Parametreleri

Bir tür parametresine geçirilmesine izin verilen tür türlerini kısıtlamak isteyeceğiniz zamanlar olabilir. Örneğin, sayılar üzerinde çalışan bir yöntem, yalnızca Number veya alt sınıflarının örneklerini kabul etmek isteyebilir. Sınırlı tip parametreleri bunun içindir.

Sınırlı bir tür parametresi bildirmek için, tür parametresinin adını, ardından extends anahtar sözcüğünü ve ardından üst sınırını listeleyin.

Misal

Aşağıdaki örnek, extends'in genel anlamda "extends" (sınıflarda olduğu gibi) veya "uygulama" (arayüzlerde olduğu gibi) anlamında nasıl kullanıldığını göstermektedir. Bu örnek, Karşılaştırılabilir üç nesneden en büyüğünü döndürmek için Genel yöntemdir -

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"));
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

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

Genel Sınıflar

Sınıf adının ardından bir tür parametresi bölümü gelmesinin dışında, genel bir sınıf bildirimi, genel olmayan bir sınıf bildirimine benzer.

Genel yöntemlerde olduğu gibi, genel bir sınıfın tür parametresi bölümü, virgülle ayrılmış bir veya daha fazla tür parametresine sahip olabilir. Bu sınıflar, bir veya daha fazla parametre kabul ettikleri için parametreli sınıflar veya parametreli türler olarak bilinir.

Misal

Aşağıdaki örnek, genel bir sınıfı nasıl tanımlayabileceğimizi göstermektedir -

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());
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

Integer Value :10
String Value :Hello World