泛型
泛型就是指參數(shù)化類型,用符號(hào)標(biāo)記是實(shí)際類型的占位符,是從JDK1.5出現(xiàn)的新特性。
泛型可分為:
- 泛型類
- 泛型方法
- 泛型接口
有了泛型以后,可以省去不必要的類型轉(zhuǎn)換,還提高了類型的安全性。
例:
public class Generator <T>{
private T target;
public T getTarget() {
return target;
}
public Generator(T target) {
this.target = target;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "target = " + target + ", target type is \"" + target.getClass().getName()+ "\"";
}
}
class Generator2{
//不用泛型的版本 只能使用Object類型
private Object target;
public Generator2(Object target) {
this.target = target;
}
public Object getTarget() {
return target;
}
public String toString() {
// TODO Auto-generated method stub
return "target = " + target + ", target type is \"" + target.getClass().getName()+ "\"";
}
}
class Test{
public static void main(String[] args) {
/*
Generator<Integer> intElem = new Generator<Integer>(88);
System.out.println(intElem);
Generator<String> strElem = new Generator<String>("hello");
System.out.println(strElem);
intElement = strElement; 錯(cuò)誤
輸出:
target = 88, target type is "java.lang.Integer"
target = hello, target type is "java.lang.String"
*/
Generator2 intElem = new Generator2(88);
int intElement = (Integer) intElem.getTarget();//需要強(qiáng)轉(zhuǎn)
System.out.println(intElem);
Generator2 StrElem = new Generator2("hello");
intElem = StrElem;//正確
System.out.println(intElem);
/*結(jié)果:
target = 88, target type is "java.lang.Integer"
target = hello, target type is "java.lang.String"
*/
}
}
//泛型的作用還是很明顯的
泛型類
泛型類定義的格式:
class 類名<類型占位符>{}注意:
- 泛型類對象創(chuàng)建格式:
類名<類型名> = new 類名<類型名>();- 泛型類確定類型是在創(chuàng)建對象的時(shí)候;
- 對象創(chuàng)建指定類型時(shí)不能是基本數(shù)據(jù)類型(int byte short long
char float double boolean ),如果是基本數(shù)據(jù)類型,必須使
用其封裝類型(JDK1.5之后支持自動(dòng)裝箱和自動(dòng)拆箱)。- 類型參數(shù)可以有多個(gè)用逗號(hào)隔開就好。
- 如果一個(gè)類已經(jīng)自定義了泛型,使用該類創(chuàng)建對象的時(shí)候如果沒有指> > 定泛型的具體數(shù)據(jù)類型,那么默認(rèn)為Object類型。
- 靜態(tài)的函數(shù)不能使用類上自定義的泛型,如果靜態(tài)函數(shù)需要使用,必須要在函數(shù)上自定義泛型。
泛型方法
泛型方法定義格式:
修飾符 <聲明自定義的泛型>返回值類型 函數(shù)名 (自定義的泛型 變量名..)注意:
- 泛型方法中 的自定義泛型的具體數(shù)據(jù)類型是在調(diào)用該函數(shù)的時(shí)候傳入
實(shí)參時(shí)確定的。- 自定義泛型所用的標(biāo)識(shí)符只要符合標(biāo)識(shí)符的命名規(guī)則即可(泛型類也一
樣),一般都習(xí)慣使用一個(gè)大寫字母表示。泛型接口
泛型接口定義方式:
interface 接口名<聲明自定義的泛型>{}注意:
- 泛型接口上的自定義泛型是在實(shí)現(xiàn)該接口的時(shí)候指定具體數(shù)據(jù)類型
的。- 如果實(shí)現(xiàn)接口的時(shí)候沒有指定接口上 的自定義泛型的具體數(shù)據(jù)類型,
那么默認(rèn)為Object數(shù)據(jù)類型。- 如果需要在創(chuàng)建接口實(shí)現(xiàn)類對象的時(shí)候才指定接口上自定義泛型,那
么需要以下格式:class<T> 類名 implements 接口<T>
泛型界限
有時(shí)候需要指定類型參數(shù)的范圍,比如說只能指定數(shù)字,可以用
<T extends Number>
例:
public class AverageNum {
public static <T extends Number>void getAverage(T... nums){
//JDK1.5新特性 可變參數(shù)
double sum = 0;
for (T t : nums){
sum=sum+t.doubleValue();
}
System.out.println("平均值是 : " + (sum/nums.length));
}
public static void main(String[] args) {
getAverage(1, 0, 13, 3);
//輸出: 平均值是 : 4.25
getAverage(2.3, 4.5, 5);
//輸出:平均值是 : 3.9333333333333336
// getAverage("s", "d", "a"); 錯(cuò)誤
}
}
使用通配符