亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Core Java筆記 8.泛型(II)

2019-11-15 00:07:28
字體:
來源:轉載
供稿:網友
Core java筆記 8.泛型(II) - 高級語法與最佳實踐本章重點:
  • 高級語法:通配符
  • 最佳實踐

本文介紹泛型的高級語法已經最佳實踐。Java 泛型的很多限制都可以從上篇中的原理(Java 泛型機制) 來解釋。

通配符

通配符是使用的角度而言的,在編譯器期間執行更加嚴格的檢查。

子類限定通配符

語法:Pair<? extends Employee>

繼承關系:corejava-generic-pic01限制:只需要從編譯器如何翻譯代碼塊的角度思考這些限制。

Employee emp = new Employee();Manager ceo = new Manager();Manager cfo = new Manager();Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK// 編譯器只知道是某個Employee的子類,編譯器推斷不出具體的類型// 限制: 編譯器拒絕任何特定類型// void setFirst(? extends Employee)wildcardBuddies.setFirst(ceo); // compile-time errorwildcardBuddies.setFirst(emp); // compile-time errorwildcardBuddies.setFirst(new Object()); // compile-time error// ? extends Employee getFirst()Employee ret = wildcardBuddies.getFirst(); // OK
超類限定通配符

語法:Pair<? super Manager>

繼承關系:corejava-generic-pic02

限制:

Employee e1 = new Employee();Employee e2 = new Employee();Manager ceo = new Manager();Pair<Employee> employeeBuddies = new Pair<Employee>();Pair<? super Manager> wildcardBuddies = employeeBuddies;  // OK// 編譯器值知道是某個Manager的父類// 限制: 編譯器拒絕任何特定類型// ? super ManagerManager ret = wildcardBuddies.getFirst(); // compile-time error// void setFirst(? super Manager)wildcardBuddies.setFirst(e1);  // compile-time errorwildcardBuddies.setFirst(ceo); // OK

更加嚴格的寫法:

public static <T extends Comparable> T min(T[] a);// 更加嚴格的寫法public static <T extends Comparable<? super T>> T min(T[] a);

解釋:該泛型方法使用Comparable<? super T>進行擦除,現在 compareTo 寫成:int compareTo(? super T). 表明只需要 T的父類有 compareTo() 方法即可.例如:GregorianCalendar 是 Calendar 的子類,Calendar實現了Comparable, 但是 GregorianCalendar 并沒有重寫Comparable, 所以:public static > T min(T[] a); 是不夠的。

補充:無限定通配符

語法:Pair<?>

限制:

? getFirst();  // 只能賦給一個Objectvoid setFirst(?); // 無法調用, Object也不行

存在的理由:對于簡單的操作,代替泛型方法,更加具有可讀性。比如:

public static <T> boolean hasNulls(Pair<T> p)// 可以寫成:public static boolean hasNull(Pair<?> p) {   return p.getFirst() == null || p.getSecond() == null; }

局限:? 不能作為一種類型。? t = xx 非法。這樣導致只能代替操作簡單的泛型方法。比如swap都寫不了.

public static void swap(Pair<?> p) {    ? t = p.getFirst;   // ERROR    p.setFirst(p.getSecond);    p.setSecond(t);}// 這時候只能:public static <T> void swapHelper(Pair<T> p) {    T t = p.getFirst;   // ERROR    p.setFirst(p.getSecond);    p.setSecond(t);}public static void swap(Pair<?> p) {    swapHelper(p);}

最佳實踐1.不能使用基本類型實例化類型參數. 才有 wrapper 即可.2.類型查詢只適用于原始類型. 即類型檢查直接使用原始類型即可.
if (a instanceof Pair<String>) // same as "a instanceof Pair"if (a instanceof Pair<T>) // T is ignoredPair<String> p = (Pair<String>)a; // can only test that a is a PairPair<String> stringPair = ...;Pair<Employee> employeePair = ...;if (stringPair.getClass() == employeePair.getClass()) // they are equal, Pair.class
3.泛型類無法擴展 Throwable,也無法拋出泛型類.
// 1. 泛型類無法擴展 Throwablepublic class PRoblem<T> extends Exception {/*...*/} // ERROR -- can't extend Throwable(編譯無法通過)// 2. 不能拋出泛型類示例public static <T extends Throwable> void doWork(Class<T> t) {    try {        do work    } catch (T e) {// ERROR -- cant't catch type variable        Logger.global.info(...)    }}// 正確時間:public static <T extends Throwable> void doWork(Class<T> t) {    try {        do work    } catch (Throwable realCause) {        t.intCause(realCause);        throw t;    }}
4.參數化類型的數組不合法,而是采用容器類存儲.
Pair<String>[] table = new Pair<String>[10];  // ERROR
5.可以聲明類型參數,但不能實例化類型參數

new T(...), new T[...], T.class 非法. 但是可以聲明.

問題1.

public Pair() { first = new T(); second = new T(); } // ERRORfirst = T.class.newInstance(); // ERROR// 最佳實踐: 指定T的類型public static <T> Pair<T> makePair(Class<T> clazz) {    try {        return new Pair(clazz.newInstance(), clazz.newInstance());    } catch (Exception e) {        return null;    }}Pair<String> stringPair = Pair.<String>makePair(String.class);// OK

問題2.

public static <T extends Comparable<? super T>> T[] minmax(T... a) {    // T[] mm = new T[2]; // ERROR, Type parameter 'T' cannot be instantiated directly    Object[] mm = new Object[2];    mm[0] = a[0];    mm[1] = a[1];    return (T[])mm; // T 被擦成Comparable, 運行時會ClassCastException, 而Object不是Comparable}public static void main(String[] args) {    String[] ss = minmax("Tom", "Dick", "Harry"); // ClassCastException!!!}// Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable}// 最佳實踐: public static <T extends Comparable<? super T>> T[] minmax(T... a) {    T[] mm = (T[])Array.newInstance(a.getClass().getComponentType(), 2);    ...    return mm;}

問題3.

public class ArrayList<T> {    private T[] elements;    public ArrayList() { elements  = (T[]) new Object[10]; }    public T get(int n) { return elements[n]; }    public void set(int n, T e) { elements[n] = e; }    public static void main(String[] args) {        ArrayList<String> src = new ArrayList<String>();        src.set(0, "hello");        src.set(1, "world");        // String[]和Object[]是不同的類型.//        String[] copy = src.toArray(); // Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;                String[] copy2 = new String[100];        src.toArray(copy2);        System.out.println(Arrays.toString(copy2));  // OK    }        public T[] toArray() {        // 可以分析:elements.getClass().getComponentType()實質是Object, 所以返回的類型實質是:Object[],        T[] result = (T[]) Array.newInstance(elements.getClass().getComponentType(), elements.length);        return result;    }    public T[] toArray(T[] src) {        for (int i = 0; i < elements.length; ++i) {            src[i] = elements[i];        }        return src;    }}
6.不能在靜態域或者方法中使用類型變量. 因為靜態域是類共享的.7. 當T和S有繼承關系時,Pair<T>Pair<S> 沒有繼承關系.8. Java SE5.0 增加了對泛型的反射API.

Java SE5.0 增加了 java.lang.reflect.Type 來支持類型的反射信息.public void > minmax(T... a);

corejava-generic-pic03


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久人人爽亚洲精品天堂| 国产在线视频2019最新视频| 国产欧美日韩免费看aⅴ视频| 这里只有视频精品| 欧美激情按摩在线| 亚洲在线www| 在线视频日韩精品| 国产91对白在线播放| 久久久综合av| 欧美成人精品影院| 欧美日韩亚洲视频| 欧美午夜宅男影院在线观看| 国产69精品久久久久久| 亚洲精品一区久久久久久| 国产精品羞羞答答| 国产色综合天天综合网| 国产精品美女无圣光视频| 国产一区二区三区久久精品| 欧美在线性视频| 色琪琪综合男人的天堂aⅴ视频| 国外成人在线播放| 国产精品jvid在线观看蜜臀| 国产精品91久久久| 亚洲精品按摩视频| 欧美日韩一区二区在线播放| 欧美老肥婆性猛交视频| 欧美色道久久88综合亚洲精品| 亚洲国产欧美一区二区丝袜黑人| 欧美午夜激情小视频| 91免费在线视频| 国产精品中文字幕久久久| 最近中文字幕日韩精品| 成人淫片在线看| 日韩精品亚洲视频| 亚洲a成v人在线观看| 日韩成人av网| 一区二区三区回区在观看免费视频| 精品久久久久久久久久ntr影视| 亚洲国产免费av| 欧美孕妇性xx| 国产精品视频不卡| 欧美与黑人午夜性猛交久久久| 日韩av网站在线| 中文字幕在线观看日韩| 这里精品视频免费| 亚洲另类激情图| 国产亚洲欧洲高清| 欧美性少妇18aaaa视频| 国产精品欧美激情在线播放| 91九色国产在线| 成人亚洲综合色就1024| 96pao国产成视频永久免费| 欧美激情精品久久久久久大尺度| 日本一区二三区好的精华液| 亚洲色图狂野欧美| 久久亚洲综合国产精品99麻豆精品福利| 久久亚洲精品国产亚洲老地址| 欧美日韩国产黄| 性欧美xxxx视频在线观看| 成人性生交大片免费观看嘿嘿视频| 欧美激情视频一区二区| 久久天天躁狠狠躁夜夜av| 国产69久久精品成人看| 成人性生交大片免费看视频直播| 国产精品久久久久久久久久久不卡| 精品爽片免费看久久| 色偷偷av一区二区三区| 欧美在线观看日本一区| 91a在线视频| 911国产网站尤物在线观看| 国产精品亚发布| 国产拍精品一二三| 欧美精品激情blacked18| 另类美女黄大片| 国产日韩欧美夫妻视频在线观看| 久久久精品视频成人| 一区二区三区动漫| 久久久久999| 欧美激情性做爰免费视频| 国产精品人人做人人爽| 久久久免费高清电视剧观看| 国产午夜精品免费一区二区三区| 欧美激情a∨在线视频播放| 久久99精品久久久久久噜噜| 日韩高清免费在线| 国产日韩换脸av一区在线观看| 午夜精品久久久久久久久久久久久| 亚洲免费电影一区| 欧美日韩国产丝袜美女| 日韩精品视频三区| 久久精品亚洲热| 高潮白浆女日韩av免费看| 91国产精品91| 另类视频在线观看| 日韩精品中文字幕有码专区| 伊人一区二区三区久久精品| 国产99久久精品一区二区| 欧美性猛交xxxx免费看漫画| 亚洲国产日韩欧美在线动漫| 91美女片黄在线观看游戏| 精品一区二区三区四区在线| 91av国产在线| 亚洲福利视频网站| 国产免费一区二区三区在线能观看| 日韩在线播放视频| 激情亚洲一区二区三区四区| 欧美激情亚洲另类| 亚洲v日韩v综合v精品v| 国产在线视频91| 国产98色在线| 亚洲а∨天堂久久精品9966| 国产一区二区三区三区在线观看| 精品综合久久久久久97| 91免费在线视频网站| 国产亚洲精品久久| 亚洲影视中文字幕| 日韩精品极品毛片系列视频| 欧美俄罗斯乱妇| 国产91精品视频在线观看| 亚洲人成电影在线观看天堂色| 亚洲精品美女久久| 日本在线精品视频| 欧洲永久精品大片ww免费漫画| 国产免费观看久久黄| 日本精品久久久久影院| 在线国产精品视频| 在线电影中文日韩| 欧美激情免费看| 国产精品色视频| 亚洲国产日韩一区| 俺也去精品视频在线观看| 日韩一区二区三区在线播放| 精品国偷自产在线视频| 日韩视频第一页| 亚洲激情久久久| 国产精品国产自产拍高清av水多| 欧美精品久久久久久久久| 成人深夜直播免费观看| 国内外成人免费激情在线视频| 97热在线精品视频在线观看| 欧洲s码亚洲m码精品一区| 亚洲一区中文字幕在线观看| 亚洲欧美三级在线| 日韩精品欧美激情| yw.139尤物在线精品视频| 国产精品91免费在线| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品91一区| 欧美精品videosex牲欧美| 久久久91精品国产| 日韩专区中文字幕| 久久久国产精品一区| 亚洲精品国产精品国自产观看浪潮| 久久91亚洲精品中文字幕奶水| 日韩精品亚洲精品| 国产精品久久久久久av福利| 国产91亚洲精品| 国产精品激情自拍| 97色在线视频观看| 亚洲伊人一本大道中文字幕| 国产成人精品优优av| 成人精品在线视频| 亚洲专区中文字幕| 在线视频免费一区二区|