位置:首页 > Java技术 > Java基础教程 > Java泛型

Java泛型

可以在一个整数数组,字符串数组或支持排序任何类型的数组中的元素进行排序单一排序方法。

Java的泛型方法和泛型类,使程序员可以指定,用一个方法声明中,一组相关的方法,或者用一个单独的类声明中,分别为一组相关的类型。

泛型还提供编译时类型安全,它允许程序员在编译时捕获无效的类型。

使用Java泛型的概念,我们可以编写一个通用的方法进行排序对象的数组,然后用整型数组,数组双,字符串数组等调用泛型方法,对数组元素进行排序。

泛型方法:

可以调用不同类型的参数一个通用的方法声明。基于传递给泛型方法的参数的类型,编译器适当地处理每个方法调用。以下是定义泛型方法的规则:

  • 所有泛型方法的声明有一个类型参数部分由尖括号分隔(<and>)之前的方法的返回类型(<E>下一个例子)。

  • 每个类型参数部分包含用逗号分隔的一个或多个类型参数。 一个类型参数,也称为类型变量,是一个标识符,用于指定一个泛型类型的名称。

  • 类型参数可以用来声明的返回类型和充当占位符传递给泛型方法,它被称为实际类型参数的参数的类型。

  • 泛型方法的身体就像是任何其他方法的声明。需要注意的是类型参数只能表示引用类型,而不是原始类型(如int,double和char)。

例子:

下面的例子演示了如何我们可以使用一个通用的方法,打印不同类型的数组:

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( "
Array doubleArray contains:" );
        printArray( doubleArray ); // pass a Double array

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

这将产生以下结果:

Array integerArray contains:
1 2 3 4 5 6

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

限制类型参数:

有可能有时候,会希望限制该种被允许被传递到一个类型参数的类型。例如,运行在数字的方法可能只希望接受数或其子类的实例。这就是界定类型参数。

声明一个界定类型参数,列出类型参数的名称,后面是extends关键字,其次是它的上限。

例子:

下面的例子演示了如何扩展是用在一般意义上是指无论是“扩展”(如类)或“工具”(如接口)。这个例子是通用方法返回最大的三个比较对象:

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

", 
                   3, 4, 5, maximum( 3, 4, 5 ) );

      System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f

",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );

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

这将产生以下结果:

Maximum of 3, 4 and 5 is 5

Maximum of 6.6, 8.8 and 7.7 is 8.8

Maximum of pear, apple and orange is 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("Hello World"));

     System.out.printf("Integer Value :%d

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

这将产生以下结果:

Integer Value :10

String Value :Hello World