鍍金池/ 教程/ Java/ Java 泛型
Java 接口
Java 方法
Java 數(shù)字
Java 條件判斷
Java 異常處理
Java 字符
Java 重寫
Java 網(wǎng)絡(luò)編程
Java 數(shù)據(jù)結(jié)構(gòu)
Java 的對象和類
Java 多線程
Java 封裝
Java 數(shù)組
Java Applet 基礎(chǔ)
Java 庫類
Java 抽象
Java 繼承
Java 正則表達(dá)式
Java 描述符的類型
Java 發(fā)送郵件
Java 序列化
Java 泛型
Java 多態(tài)
Java 變量類型
Java 基本數(shù)據(jù)類型
Java 包
Java 快速參考指南
Java 基本運(yùn)算符
Java 概述
Java 字符串
Java 循環(huán)控制
Java 環(huán)境設(shè)置
Java 文件注釋
Java 文件和 I/O
Java 集合
Java 基本語法
Java 日期和時(shí)間

Java 泛型

如果我們可以寫一個(gè)單獨(dú)的能在一個(gè)整型數(shù)組,一個(gè)字符串?dāng)?shù)組或者一個(gè)任何類型支持排序的數(shù)組內(nèi)排列元素的排序方法將會(huì)是很好的。

Java Generic 方法和 generic 類讓程序員可以用一種單獨(dú)的方法聲明,一系列有關(guān)的方法或者用一個(gè)單獨(dú)的類聲明來各自指定一系列有關(guān)的類型。

Generic 也提供了編譯時(shí)類型安全來允許程序員在編譯時(shí)捕獲無效的類型。

使用 Java Generic 概念,我們可以寫一個(gè)泛型方法來給對象數(shù)組排序,然后調(diào)用帶有整型數(shù)組,double 型數(shù)組,字符串?dāng)?shù)組或其他的泛型方法來為數(shù)組元素排序。

泛型方法

你可以寫一個(gè)單獨(dú)的可以被不同類型的參數(shù)調(diào)用的泛型方法聲明?;趥鹘o泛型方法的參數(shù)類型,編譯器正確處理每個(gè)調(diào)用的方法。以下是定義泛型方法的規(guī)則:

  • 所有的泛型方法聲明在方法的返回值之前(下一個(gè)例子中的)有一個(gè)由尖括號(hào)分隔開的類型參數(shù)區(qū)域。()
  • 類型參數(shù)能被用來聲明返回類型和作為傳給泛型方法的參數(shù)類型的占位符,就是為人所知的真正的類型參數(shù)。
  • 一個(gè)泛型方法的主體像其他方法聲明一樣。注意到類型參數(shù)僅能代表引用類型,而不是原始類型(就像 int,double 和 char)。

示例

以下的例子說明了我們可以通過一個(gè)通用的方法來打印不同類型的數(shù)組:

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

這將產(chǎn)生以下結(jié)果:

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

受限的類型參數(shù)

有時(shí)候你想要限制允許傳給一個(gè)類型參數(shù)的類型種類。例如,操作數(shù)的方法可能僅僅想要接受 Number 的實(shí)例或者它的子類。這就是有限的類型參數(shù)。

聲明一個(gè)有限的類型參數(shù),列舉類型參數(shù)的名字,后面跟著擴(kuò)展關(guān)鍵字和它的上界。

示例

下面的例子說明了如何使用擴(kuò)展在一定意義上意味著“繼承”(在類中)或是在“實(shí)現(xiàn)”(在接口中)。這個(gè)例子是返回三個(gè) 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( "Maxm 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" ) );
   }
}

這將會(huì)產(chǎn)生以下結(jié)果:

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

泛型類

泛型類的聲明看起來像一個(gè)非泛型類的聲明,除了類名后跟著一個(gè)類型參數(shù)區(qū)域。

與泛型方法一樣,一個(gè)泛型類的類型參數(shù)區(qū)域可以擁有一個(gè)或者更多的由逗號(hào)分隔的類型參數(shù)。這些類被稱為參數(shù)化的類或是參數(shù)化的類型因?yàn)樗麄兘邮芤粋€(gè)或更多的參數(shù)。

示例

下面的例子說明了我們怎樣定義一個(gè)泛型類:

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

這將產(chǎn)生以下結(jié)果:

Integer Value :10

String Value :Hello World