泛型的基本定義及使用


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、 “?”可以接收任意泛型類型,只可取出,不能修改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM