Latest web development tutorials

Java Дженерики

Java генерики (дженерики) является новая функция введена в JDK 5, генерики обеспечивают время компиляции безопасности тип механизма тестирования, который позволяет программисту во время компиляции тип обнаруженного незаконным.

Общий характер параметризованного типа, тип данных означает, что операция задается в качестве параметра.

Предположим, что у нас есть такое требование: написать метод сортировки, способный формировать массив, массив строк или любой другой тип массива для сортировки, как достичь?

Ответ заключается в том , что вы можете использовать Java генерики.

Использование Java Дженерики, мы можем написать общий метод для сортировки массива объектов. Затем вызовите шаблонный метод на массив целых чисел с плавающей точкой массивы, строки, массивы и сортируют.


Общий метод

Вы можете написать общий метод, который может быть получен при вызове различных типов параметров. Для универсального метода типа параметра, сделка компилятор с каждым вызовом метода с момента передачи соответствующим образом.

Вот правила, чтобы определить общий метод:

  • Все объявить общий метод имеет объявление параметра секции типа (разделенных угловых скобках), объявление в разделе параметр типа перед типом метода возвращения (в следующем примере <E>).
  • Каждый тип объявления параметров раздел содержит один или несколько параметров типа, разделенных запятыми между параметрами. Общий параметр, также известный как идентификатор переменной типа используется для указания имени универсального типа.
  • Параметры типа могут использоваться для объявления типа возвращаемого, и может быть получена в качестве общего фактического типа параметра заполнитель.
  • Объявите универсальный метод и другие методы, такие как тела. Обратите внимание, что тип параметра типа может представлять только ссылочный тип, а не примитивный тип (например, INT, двойной, символ и т.д.).

примеров

В следующем примере показано, как использовать общие методы различных печати строки элементов:

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }

    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 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( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组

        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组

        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}

Компиляция приведенный выше код, результаты выглядят следующим образом:

整型数组元素为:
1 2 3 4 5 

双精度型数组元素为:
1.1 2.2 3.3 4.4 

字符型数组元素为:
H E L L O 

Там ограниченные параметры типа:

Там может быть раз вы хотите ограничить, кому позволено перейти к параметру своего рода типа диапазона типа. Например, цифровой метод работы может только хочет принимать экземпляры номер или номер подклассов. Это назначение параметра ограниченного типа.

Чтобы объявить ограниченный тип параметра, имя параметра типа первым в списке, за которым следует ключевое слово расширяется, наконец, последовала его верхняя граница.

примеров

Следующий пример демонстрирует "расширяет" Как использовать в общем смысле означает "проходит" (категория) или "орудия" (интерфейс). Пример универсального метода возвращает максимум три сопоставимые объекты.

public class MaximumTest
{
   // 比较三个值并返回最大值
   public static <T extends Comparable<T>> T maximum(T x, T y, T z)
   {                     
      T max = x; // 假设x是初始最大值
      if ( y.compareTo( max ) > 0 ){
         max = y; //y 更大
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // 现在 z 更大           
      }
      return max; // 返回最大对象
   }
   public static void main( String args[] )
   {
      System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
                   3, 4, 5, maximum( 3, 4, 5 ) );
 
      System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
 
      System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

Компиляция приведенный выше код, результаты выглядят следующим образом:

3, 4 和 5 中最大的数为 5

6.6, 8.8 和 7.7 中最大的数为 8.8

pear, apple 和 orange 中最大的数为 pear

Общий класс

Подобные заявления и заявления необщего класса универсального класса, в дополнение к имени класса, добавьте раздел декларации типа параметра.

И общие методы, общий тип класса объявления параметров раздел также содержит один или несколько параметров типа, разделенных запятыми между параметрами. Общий параметр, также известный как идентификатор переменной типа используется для указания имени универсального типа. Потому что они принимают один или несколько параметров, эти классы называются параметризованные классы или параметризованные типы.

примеров

Следующие примеры демонстрируют, как мы определим общий класс:

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("本教程"));

    System.out.printf("整型值为 :%d\n\n", integerBox.get());
    System.out.printf("字符串为 :%s\n", stringBox.get());
  }
}

Компиляция приведенный выше код, результаты выглядят следующим образом:

整型值为 :10

字符串为 :本教程