无涯教程-Java - 泛型

51 阅读2分钟

Java泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。

泛型方法

您可以编写一个可以用不同类型的参数调用的通用方法声明。 根据传递给泛型方法的参数类型,编译器会适当地处理每个方法调用。 

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[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { H, E, L, L, O };

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Array integerArray contains:"</span><span class="pun">);</span><span class="pln">
  printArray</span><span class="pun">(</span><span class="pln">intArray</span><span class="pun">);</span><span class="pln">   </span><span class="com">//传递一个整数数组</span><span class="pln">

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"\nArray doubleArray contains:"</span><span class="pun">);</span><span class="pln">
  printArray</span><span class="pun">(</span><span class="pln">doubleArray</span><span class="pun">);</span><span class="pln">   </span><span class="com">//传递一个 Double 数组</span><span class="pln">

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"\nArray characterArray contains:"</span><span class="pun">);</span><span class="pln">
  printArray</span><span class="pun">(</span><span class="pln">charArray</span><span class="pun">);</span><span class="pln">   </span><span class="com">//传递一个字符数组</span><span class="pln">

} }

这将产生以下输出-

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

有界参数

有时您可能希望限制允许传递给类型参数的类型。例如,对Number进行操作的方法可能只希望接受Number或其子类的实例。这就是有界类型参数的用途。

若要声明有界类型参数,请列出类型参数的名称,后跟extensions关键字。

以下示例说明了extends在一般意义上是如何表示“ extends”(如在类中)或“ implements”(如在接口中)。 此示例是返回三个Comparable 对象中最大对象

public class MaximumTest {
   //确定三个 Comparable 对象中最大的一个

public static <T extends Comparable<T>> T maximum(T x, T y, T z) { T max = x; //假设 x 最初是最大的

  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">y</span><span class="pun">.</span><span class="pln">compareTo</span><span class="pun">(</span><span class="pln">max</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     max </span><span class="pun">=</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">   </span><span class="com">//y 是迄今为止最大的</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  
  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">z</span><span class="pun">.</span><span class="pln">compareTo</span><span class="pun">(</span><span class="pln">max</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     max </span><span class="pun">=</span><span class="pln"> z</span><span class="pun">;</span><span class="pln">   </span><span class="com">//z现在是最大的         </span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> max</span><span class="pun">;</span><span class="pln">   </span><span class="com">//返回最大的对象</span><span class="pln">

}

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

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"Max of %.1f,%.1f and %.1f is %.1f\n\n"</span><span class="pun">,</span><span class="pln">
     </span><span class="lit">6.6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8.8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7.7</span><span class="pun">,</span><span class="pln"> maximum</span><span class="pun">(</span><span class="pln"> </span><span class="lit">6.6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8.8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7.7</span><span class="pln"> </span><span class="pun">));</span><span class="pln">

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"Max of %s, %s and %s is %s\n"</span><span class="pun">,</span><span class="str">"pear"</span><span class="pun">,</span><span class="pln">
     </span><span class="str">"apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"orange"</span><span class="pun">,</span><span class="pln"> maximum</span><span class="pun">(</span><span class="str">"pear"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"orange"</span><span class="pun">));</span><span class="pln">

} }

这将产生以下输出-

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

泛型类

泛型类声明看起来与非泛型类声明类似,不同之处在于类名后跟类型参数部分。

以下示例说明了如何定义泛型类-

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</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Integer</span><span class="pun">(</span><span class="lit">10</span><span class="pun">));</span><span class="pln">
  stringBox</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">));</span><span class="pln">

  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"Integer Value :%d\n\n"</span><span class="pun">,</span><span class="pln"> integerBox</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">());</span><span class="pln">
  </span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"String Value :%s\n"</span><span class="pun">,</span><span class="pln"> stringBox</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">());</span><span class="pln">

} }

这将产生以下输出-

Integer Value :10
String Value :Hello World

参考链接

www.learnfk.com/java/java-g…