泛型的核心概念:告訴編譯器想使用什么類型洗出,然后它幫你處理一切細(xì)節(jié)
泛型類定義
class Holder<T>{
private T a;
public Holder(T a){
this.a = a;
}
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
}
class Holder<T>中的T就是類型參數(shù)士复,類型參數(shù)的命名規(guī)則跟變量的命名規(guī)則一樣,但常用T翩活、E阱洪、K、V命名菠镇,一般使用一個(gè)大寫字母冗荸。
Holder<String> strHolder = new Holder<String>("str");
//Holder<Integer> intHolder = new Holder<Integer>("str");
//參數(shù)類型定義為Integer,傳入string的話編譯器就會(huì)拒絕
String str = strHolder.getA();//編譯會(huì)自動(dòng)轉(zhuǎn)換成String利耍,不需要做類型轉(zhuǎn)換
泛型的好處顯而易見蚌本,Holder可以處理所有類型,編譯器幫助類型判斷與類型轉(zhuǎn)換隘梨,Java1.5后集合類使用泛型實(shí)現(xiàn)程癌,提高了可讀性和安全性。
泛型類繼承
class Holder2 extends Holder<String>{
public Holder2(String a) {
super(a);
}
@Override
public void setA(String a) {
super.setA(a);
}
@Override
public String getA() {
return super.getA();
}
}
繼承泛型類的時(shí)候需要指明繼承類的類型參數(shù)轴猎,如果不聲明的話嵌莉,編譯器會(huì)把它當(dāng)成Object
class Holder3 extends Holder{
public Holder3(Object a) {
super(a);
}
@Override
public void setA(Object a) {
super.setA(a);
}
@Override
public Object getA() {
return super.getA();
}
}
這樣的話Holder2和Holder3就不是泛型類了,也可以這樣繼承
class Holder4<T> extends Holder<T>{
public Holder4(T a) {
super(a);
}
@Override
public void setA(T a) {
super.setA(a);
}
@Override
public T getA() {
return super.getA();
}
}
Holder4依然是泛型類捻脖,父類的參數(shù)類型也是由Holder4在使用時(shí)定義
class Holder5<T,E,K,V> extends Holder<T>{
private E e;
public Holder5(T a) {
super(a);
}
}
泛型類是可以定義多個(gè)類型參數(shù)的
泛型接口定義
泛型接口的定義跟泛型類的定義差不多
interface Holder<T>{
void setElement(T t);
T getElement();
}
class HolderImpl implements Holder<String>{
@Override
public void setElement(String s) {
}
@Override
public String getElement() {
return null;
}
}
泛型方法定義
class Holder{
public <T> void f(T t){
System.out.println(t.getClass().getName());
}
}
Holder holder = new Holder();
holder.f(33);
holder.f("1231");
在返回值前面聲明類型參數(shù),使用的時(shí)候不用指定具體類型锐峭,編譯器會(huì)做類型推斷
目錄
學(xué)會(huì)Java泛型系列(零):簡介及目錄
學(xué)會(huì)Java泛型系列(一):Java泛型
學(xué)會(huì)Java泛型系列(二):泛型定義與使用
學(xué)會(huì)Java泛型系列(三):泛型原理-擦除
學(xué)會(huì)Java泛型系列(四):擦除帶來的問題以及解決辦法
學(xué)會(huì)Java泛型系列(五):限定符
學(xué)會(huì)Java泛型系列(六):總結(jié)
學(xué)會(huì)Java泛型系列(七):常用案例