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 5Array 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">></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">></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 5Max 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