Latest web development tutorials

Genéricos Java

genéricos Java (genéricos) é um novo recurso introduzido no JDK 5, os genéricos fornecer em tempo de compilação mecanismo de teste tipo de segurança que permite que o programador em tempo de compilação tipo de ilegal detectado.

A natureza genérica do tipo parametrizado, tipo de dados significa que a operação é especificado como um parâmetro.

Suponha que temos uma tal exigência: escrever um método de triagem, capaz de moldar a matriz, uma matriz de cadeias ou qualquer outro tipo de matriz para classificar, como conseguir?

A resposta é que você pode usar os genéricos Java.

Use Java Generics, podemos escrever um método genérico para classificar uma matriz de objetos. Em seguida, chamar o método genérico para um array de inteiros, matrizes de pontos, strings, matrizes e ordenada flutuante.


método genérico

Você pode escrever um método genérico que pode ser recebido ao chamar diferentes tipos de parâmetros. Para o método genérico tipo de parâmetro, o negócio compilador com cada chamada de método da transferência de forma adequada.

Aqui estão as regras para definir um método genérico:

  • Todos declarar um método genérico tem uma seção tipo de declaração de parâmetro (separados por colchetes), a seção de declaração de tipo de parâmetro antes do tipo de retorno do método (no exemplo <E> o seguinte).
  • Cada seção de declaração tipo parâmetro contém um ou mais parâmetros de tipo, separados por vírgulas entre parâmetros. Um parâmetro genérico, também conhecido como um identificador de tipo variável é utilizada para especificar o nome de um tipo genérico.
  • parâmetros de tipo pode ser usado para declarar o tipo de retorno, e pode ser obtido como um genérico real tipo de parâmetro espaço reservado.
  • Declare um método genérico e outros métodos, como o corpo. Note-se que tipo de tipo de parâmetro só pode representar um tipo de referência, não um tipo primitivo (como int, double, char, etc.).

Exemplos

O exemplo a seguir demonstra como usar métodos genéricos diferentes elementos de cadeia de impressão:

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 ); // 传递一个字符型数组
    } 
}

Compilar o código acima, os resultados são os seguintes:

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

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

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

Há parâmetros de tipo delimitadas:

Pode haver momentos em que você vai querer restringir quem tem permissão para passar para um parâmetro de tipo tipo de faixa tipo. Por exemplo, um método digital de operação só pode querer aceitar instâncias de subclasses Número ou número. Este é o propósito do parâmetro de tipo limitada.

Para declarar um parâmetro de tipo limitada, o nome do parâmetro tipo é listado primeiro, seguido pela palavra-chave extends, finalmente seguiu seu limite superior.

Exemplos

O exemplo a seguir demonstra o "estende" Como usar em um sentido sentido genérico "estende" (categoria) ou "instrumentos" (interface). O exemplo de um método genérico retorna os três objectos máximos comparáveis.

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

Compilar o código acima, os resultados são os seguintes:

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

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

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

classe genérica

declarações similares e declarações de classe não-genérico de classe genérica, além do nome da classe, acrescentar a secção de declaração tipo de parâmetro.

E métodos genéricos, seção de declaração parâmetro de tipo genérico classe também contém um ou mais parâmetros de tipo, separados por vírgulas entre parâmetros. Um parâmetro genérico, também conhecido como um identificador de tipo variável é utilizada para especificar o nome de um tipo genérico. Porque eles aceitam um ou mais parâmetros, essas classes são chamados de classes parametrizadas ou tipos parametrizados.

Exemplos

Os seguintes exemplos demonstram como podemos definir uma classe genérica:

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

Compilar o código acima, os resultados são os seguintes:

整型值为 :10

字符串为 :本教程