1、 基本概念:
范例:
class Point<T>{//T的類型未知
T x;
T y;
Point(T x, T y){
this.x=x;
this.y=y;
}
public void getPoint(){
System.out.println("x="+x+",y="+y);
}
}
public class StaticClass{
public static void main(String[] args){
Point<Integer> point=new Point<Integer>(1,2);//必須是包裝類,不支持基本類型
point.getPoint();
}
}
使用泛型之后,所有類中屬性都是動態設置的,而所有使用反省標記的方法參數類型也都要發生變化。
說明:如果使用泛型類或接口,沒有設置泛型具體類型,那么會出現編譯時的警告,並且所有泛型使用object表示。
從jdk1.7可以簡化泛型聲明:Point<Integer> point=new Point<Integer>(1,2)
等價於Point<Integer> point=new Point<>(1,2)
2、 通配符
?:匹配任意類型
?extends 類:設置泛型上限,可以在聲明和方法參數上使用。
例:? extends:可以設置Number或者Number的子類(Integer,Double.......)
?super 類:設置泛型下限,方法參數上使用。
例:? extends String :只能設置String或者它的父類Object。
上限范例:
class Message<T extends Number>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return msg;
}
}
public class TestDemo{
public static void main(String[] args){
Message<Integer> m=new Message<Integer>();
m.setMsg(100);
fun(m);
}
public static void fun(Message<? extends Number>temp){
System.out.println(temp.getMsg());
}
}
以上代碼中,如果出現了非Number或其子類,則會出現語法錯誤。
下限范例:
class Message<T>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return msg;
}
}
public class TestDemo{
public static void main(String[] args){
Message<Integer> m=new Message<Integer>();
m.setMsg(100);
fun(m);
}
public static void fun(Message<? extends String>temp){
System.out.println(temp.getMsg());
}
}
3、 泛型接口
interface Message<T>{
public void print(T t);
}
形式一:
class MessageImp<T> implements Message<T>{
public void print(T t){
System.out.print(t);
}
}
public class TestDemo{
public static void main(String[] args){
Message<String> m=new MessageImp<String>();
m.print("Hello World");
}
}
形式二:
class MessageImp implements Message<String>{
public void print(String t){
System.out.print(t);
}
}
public class TestDemo{
public static void main(String[] args){
Message<String> m=new MessageImp ();
m.print("Hello World");
}
}
4、 泛型方法
定義:
范例:
public class TestDemo{
public static void main(String[] args){
String str=fun("Hello World");
System.out.println(str);
}
public static <T>T fun(T t){//T的參數類型由傳入值決定
return t;
}
}
5、 總結
1、 泛型解決的是向下轉型所帶來的安全隱患,其核心的組成就是在聲明類或接口的時候不設置參數或屬性的類型。
2、 “?”可以接收任意泛型類型,只可取出,不能修改。