泛型定義
泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。 Java語言引入泛型的好處是安全簡單。
用來實現參數的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。對於強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現異常,這是一個安全隱患。
泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,以提高代碼的重用率。
泛型規則限制
1、泛型的類型參數只能是類類型(包括自定義類),不能是簡單類型;
2、同一種泛型可以對應多個版本(因為參數類型是不確定的),不同版本的泛型類實例是不兼容的;
3、泛型的類型參數可以有多個;
4、泛型的參數類型可以使用extends、super語句,例如。習慣上稱為“有界類型“;
5、泛型的參數類型還可以是通配符類型。例如Class> classType = Class.forName("java.lang.String");
示例對比
有這樣一個需求:定義矩形對象,使矩形對象的寬度、高度既可以支持整形又可以支持字符串類型(例子可能不太恰當~~)。在不使用泛型的情況下,我們可能會定義兩個類,一個類支持整形參數,另一個類支持字符串類型參數,如下:
類一:package com.ips.volatiles.demo1;
public class RectangleInteger {
private Integer width;
private Integer height;
public RectangleInteger(Integer width, Integer height){
this.width = width;
this.height = height;
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
Integer width = 10;
Integer height = 5;
RectangleInteger rect = new RectangleInteger(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
}
}
類二:package com.ips.volatiles.demo1;
public class RectangleString {
private String width;
private String height;
public RectangleString(String width, String height){
this.width = width;
this.height = height;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
String width = "20";
String height = "40";
RectangleString rect = new RectangleString(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
}
}
類三(泛型方式定義):package com.ips.volatiles.demo1;
public class Rectangle {
private T width;
private T height;
public Rectangle(T width, T height){
this.width = width;
this.height = height;
}
public T getWidth() {
return width;
}
public void setWidth(T width) {
this.width = width;
}
public T getHeight() {
return height;
}
public void setHeight(T height) {
this.height = height;
}
public void showDetails(){
System.out.println("the rectangle, width is " + this.width + " height is " + this.height);
}
public static void main(String [] args){
Integer width = 10;
Integer height = 5;
Rectangle rect = new Rectangle(width, height);
width = rect.getWidth();
height = rect.getHeight();
rect.showDetails();
String widthStr = "20";
String heightStr = "40";
Rectangle rect1 = new Rectangle(widthStr, heightStr);
widthStr = rect1.getWidth();
heightStr = rect1.getHeight();
rect1.showDetails();
}
}
作用
再次強調一下泛型的作用:泛型的好處是在編譯的時候進行類型安全檢查,並且所有的強制轉換都是自動和隱式的,以提高代碼的重用率。