java基礎--泛型

來源:互聯網
上載者:User

標籤:exce   調用   get   int   eric   靜態   傳遞   img   tor   

一. 泛型概念的提出(為什麼需要泛型)?

首先,我們看下下面這段簡短的代碼: 

  public class GenericTest {     public static void main(String[] args) {        List list = new ArrayList();        list.add("qqyumidi");         list.add("corn");         list.add(100);       for (int i = 0; i < list.size(); i++) {            String name = (String) list.get(i); // 1           System.out.println("name:" + name);       }    } }

在如上的編碼過程中,我們發現主要存在兩個問題:

1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。

2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。

二.什麼是泛型?

     泛型,即“參數化型別”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化型別怎麼理解呢?顧名思義,就是將類型由原來的具體的型別參數化,類似於方法中的變數參數,此       時類型也定義成參數形式(可以稱之為類型形參),然後在使用/調用時傳入具體的類型(類型實參)。

三.泛型的使用

泛型有三種使用方式,分別為:泛型類、泛型介面、泛型方法 

3.1  泛型類

  T Type 表示類型。
  K V 分別代表索引值中的Key Value。
  E 代表Element。

注意:
    1、泛型只能使用參考型別,不能基本類型
    2、在泛型類裡,泛型聲明時字母不能使用 靜態屬性|靜態方法上,在泛型方法上可以聲明在方法上

package com.zwj.fanxing;/** * 泛型類:聲明時使用泛型 * 字母: *  T  Type 表示類型。     K V 分別代表索引值中的Key Value。     E 代表Element。  使用時確定類型 注意: 1、泛型只能使用參考型別,不能基本類型 2、泛型聲明時字母不能使用 靜態屬性|靜態方法上 * @author Administrator * * @param <T> */public class Student<T1,T2> {    private T1 javaScore;    private T2 oracleScore;        //泛型聲明時不能使用 靜態屬性|靜態方法上    //private static T1 test;            public T1 getJavaScore() {        return javaScore;    }    public void setJavaScore(T1 javaScore) {        this.javaScore = javaScore;    }    public T2 getOracleScore() {        return oracleScore;    }    public void setOracleScore(T2 oracleScore) {        this.oracleScore = oracleScore;    }    /**     * @param args     */    public static void main(String[] args) {        //使用時指定類型(參考型別)        Student<String,Integer> stu = new Student<String,Integer> ();        //1、安全:類型檢查        stu.setJavaScore("優秀");        //2、省心:類型轉換        int it =stu.getOracleScore(); //自動拆箱    }}
Student<T1,T2> 泛型類:聲明時使用泛型

 

3.2 泛型介面、

package com.zwj.fanxing;/** * 介面中 泛型字母只能使用在方法中,不能使用在全域常量中 * @author Administrator * * @param <T> */public interface Comparator<T> {    void compare(T t);    }
Comparator 介面中 泛型字母只能使用在方法中,不能使用在全域常量中
package com.zwj.fanxing;/** * 泛型介面:與繼承同理 * 重寫方法隨父類而定 * * @param <T> */public interface package com.zwj.fanxing;/** * 泛型介面:與繼承同理 * 重寫方法隨父類而定 * * @param <T> */public interface Comparable<T> {    void compare(T t);}//聲明子類指定具體類型class Comp implements Comparable<Integer>{    @Override    public void compare(Integer t) {        // TODO Auto-generated method stub            }    }//擦除class Comp1 implements Comparable{    @Override    public void compare(Object t) {        // TODO Auto-generated method stub            }     }//父類擦除,子類泛型class Comp2<T> implements Comparable{    @Override    public void compare(Object t) {        // TODO Auto-generated method stub            }     }//子類泛型>=父類泛型class Comp3<T> implements Comparable<T>{    @Override    public void compare(T t) {        // TODO Auto-generated method stub            }     }//父類泛型,子類擦除 錯誤{    void compare(T t);}//聲明子類指定具體類型class Comp implements Comparable<Integer>{    @Override    public void compare(Integer t) {        // TODO Auto-generated method stub            }    }//擦除class Comp1 implements Comparable{    @Override    public void compare(Object t) {        // TODO Auto-generated method stub            }     }//父類擦除,子類泛型class Comp2<T> implements Comparable{    @Override    public void compare(Object t) {        // TODO Auto-generated method stub            }     }//子類泛型>=父類泛型class Comp3<T> implements Comparable<T>{    @Override    public void compare(T t) {        // TODO Auto-generated method stub            }     }//父類泛型,子類擦除 錯誤
Comparable 泛型介面:與繼承

 

 

 

3.3泛型方法 

 註:只能訪問對象的資訊,不能修改資訊

package com.zwj.fanxing;import java.io.Closeable;import java.io.IOException;/** * 泛型方法 <> 傳回型別前面 * 只能訪問對象的資訊,不能修改資訊 * @author Administrator * */public class TestMethod {    /**     * @param args     */    public static void main(String[] args) {        test("a"); //T -->String    }    //泛型方法    public static <T> void test(T a){                System.out.println(a);    }    // extends <=    public static <T extends Closeable> void test(T... a){                for(T temp:a){            try {                if(null!=temp){                    temp.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}
TestMethod 泛型方法 <> 傳回型別前面

 

java基礎--泛型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.