亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

認(rèn)識Java泛型

nanchen2251 / 3528人閱讀

摘要:在這種情況下,編譯器認(rèn)為調(diào)用泛型方法后,其返回值被賦給一個類型的變量顯示地指明類型參考資料編程的邏輯

一、泛型的概念

泛型實(shí)現(xiàn)了參數(shù)化類型的概念,使代碼可以用于多種類型

二、泛型的目的

希望類和方法能夠具備最廣泛的表達(dá)能力

用來指定容器要持有什么類型的對象,而且由編譯器來保證類型的正確性

三、泛型的使用

普通泛型類

public class NormalGenericsClass {
    private T key;
    public Generics(T key){
        this.key = key;
    }
    public T getKey() {
        return key;
    }
    public void setKey(T key) {
        this.key = key;
    }
}


// 泛型類實(shí)例
NormalGenericsClass a = new NormalGenericsClass(0);
// Java7 開始支持省略后面的參數(shù)類型
NormalGenericsClass a = new NormalGenericsClass<>(0);

普通泛型接口

// Java中的 Comparator接口
public interface Comparator {

    int compare(T o1, T o2);

    boolean equals(Object obj);
}

// 接口實(shí)現(xiàn)例子 java.text.Collator
public abstract class Collator implements java.util.Comparator, Cloneable
{
    //...主體代碼
}

普通泛型方法

private  int normalGenericsMethod(Generics i){ 
//  表示聲明 T為泛型,寫在返回值類型之前
// 也可以聲明多個泛型,如:
    return 0;
}

// 這是錯誤的,會提示 Cannot resolve symbol "T"
/*private int normalGenericsMethod(Generics i){ 
        return 0;
}*/

有上界的泛型:
上界:通過關(guān)鍵字extends來表示給定的上界,那么參數(shù)就必須是給定的上界或者其子類型。上界可以是某個具體的類或接口,也可以是其他參數(shù)

上界為具體的類

public class GenericsUpperBound extends NormalGenericsClass {
    public GenericsUpperBound(T key){
        super(key);
    }
}

上界為具體的接口

public  T compareWith(T[] arr){
    T start = arr[0];
    for(int i = 1; i < arr.length; i++){
        System.out.print(start.equals(arr[i]));
    }
    return start;
}

上界為其他類型參數(shù)

public class OtherUpperBound{
    public  void otherArgs(NormalGenericsClass a){
        // E是OtherUpperBound的類型參數(shù),T是otherArgs方法的類型參數(shù)
        // T的上界限定為E
    }
}

//例子:
OtherUpperBound a = new OtherUpperBound<>;
OtherUpperBound b = new OtherUpperBound<>;
a.otherArgs(b);

四、通配符

有限定通配符

//重寫6中的方法
public void otherArgs(NormalGenericsClass a){
   
}
取自《Java編程的邏輯》8.2  
的區(qū)別
:用于定義類型參數(shù),它聲明了一個類型參數(shù)T,可放在泛型類定義中類名后面、泛型方法返回值前面
:用于實(shí)例化類型參數(shù),它用于實(shí)例化泛型變量中的類型參數(shù),只是這個類型是未知的,只知道是E或E的某個子類型

無限定通配符

public int demo(OtherUpperBound a){
    
}
//  這兩個等效
public  int demo(OtherUpperBound a){
    
}

通配符重要限制: 只能讀,不能寫

取自《Java編程的邏輯》8.2  
總結(jié):
1) 通配符形式都可以用類型參數(shù)的形式來替代,通配符能做的,用類型參數(shù)都能做
2) 通配符形式可以減少類型參數(shù),形式上往往更為簡單,可讀性也更好,所以,能用通配符的就用通配符
3) 如果類型參數(shù)之間有依賴關(guān)系,或者返回值依賴類型參數(shù),或者需要寫操作,則只能用類型參數(shù)
4) 通配符形式和類型參數(shù)往往配合使用,定義必要的類型參數(shù),使用通配符表達(dá)依賴,并接受更廣泛的數(shù)據(jù)類型

超類型通配符(無法用類型參數(shù)替代)

public int demo(OtherUpperBound a){
    
}
取自《Java編程的邏輯》8.2   
總結(jié):
1)通配符的目的是為了使方法接口更為靈活,可以接受更為廣泛的類型
2)用于靈活寫入或比較,使得對象可以寫入父類型的容器,使得父類型的比較方法可以應(yīng)用于子類對象,它不能被類型參數(shù)形式替代
3)用于靈活讀取,使得方法可以讀取E或E的任意子類型的容器對象,它們可以用類型參數(shù)的形式替代,但通配符形式更為簡潔

五、泛型的局限性

父類實(shí)現(xiàn)了一個泛型接口,子類希望自定義泛型接口中的方法,只能重寫父類的實(shí)現(xiàn)

class Base implements Comparable

class Child extends Base

// 希望重寫Comparable的比較方法
/*
    class Child extends Base implements Comparable
    // 錯誤,因?yàn)轭愋筒脸脑颍瑢?shí)際實(shí)現(xiàn)的都是Comparable接口,接口不允許被實(shí)現(xiàn)兩次
*/

// 正確重寫Comparable的比較方法的方式
class Child extends Base {
    @Override
    public int compareTo(Base o){
        if(!(o instanceof Child){
            throw new IllegalArgumentException();
        }
        Child c = (Child)o;
        實(shí)現(xiàn)代碼
        return 0;
    }
    其他代碼
}

類型參數(shù)不能作為靜態(tài)變量和靜態(tài)方法的類型

Class Normal{
    public static demo1(T param){
        // 錯誤的方法
    }
    public static  void demo2(E param){
        // 正確的方法
    }
}

不能通過類型參數(shù)創(chuàng)建對象

T a = new T(); // error Type parameter "T" cannot be instantiated directly

六、泛型的使用細(xì)節(jié)

Java中的泛型是通過類型擦除實(shí)現(xiàn)的,類型參數(shù)在編譯時會被替換為Object

對于不同傳入的類型實(shí)參,生成的相應(yīng)對象實(shí)例一樣

Generics demo = new Generics<>(123);
Generics demo2 = new Generics<>("test");
System.out.println(demo.getClass() == demo2.getClass()); // true

靜態(tài)方法和泛型
靜態(tài)方法無法訪問類上定義的泛型;如果靜態(tài)方法操作的引用數(shù)據(jù)類型不確定的時候,必須要將泛型定義在方法上。即:如果靜態(tài)方法要使用泛型的話,必須將靜態(tài)方法也定義成泛型方法

/**
  如果在類中定義使用泛型的靜態(tài)方法,需要添加額外的泛型聲明(將這個方法定義成泛型方法)
  即使靜態(tài)方法要使用泛型類中已經(jīng)聲明過的泛型也不可以。
  如:public static void show(T t){..},此時編譯器會提示錯誤信息
     "StaticGenerator cannot be refrenced from static context"
*/
public static  void show(T t){
}

泛型的上下邊界添加,必須與泛型的聲明一起

//在泛型方法中添加上下邊界限制的時候,必須在權(quán)限聲明與返回值之間的上添加上下邊界,  
//即在泛型聲明的時候添加
//public  T showKeyName(Generic container)
編譯器會報(bào)錯:"Unexpected bound"
public  T showKeyName(Generic container){
    System.out.println("container key :" + container.getKey());
    T test = container.getKey();
    return test;
}

基本類型不能用于實(shí)例化類型參數(shù)
泛型要求能包容的是對象類型,基本類型在java中不屬于對象

運(yùn)行時類型查詢只適用于原始類型

NormalGenericsClass a = new NormalGenericsClass<>(0);

a instanceof NormalGenericsClass;
// Error Illegal generic type for instanceof

a instanceof NormalGenericsClass;
// Error Cannot resolve symbol "T"

a instanceof NormalGenericsClass; // Pass
a instanceof NormalGenericsClass; // Pass

a.getClass(); // class com.example.demo.generics.NormalGenericsClass

類型推斷只對賦值操作有效
Eg:

public class New{
    public static  Map map(){
        return new HashMap();
    }
}

/**
       -- 方法中傳參
 這時編譯器不會執(zhí)行類型判斷。在這種情況下,編譯器認(rèn)為:調(diào)用泛型方法后,  
 其返回值被賦給一個Object類型的變量
*/
public class Test{
    public static void main(String args[]){
        fun(New.map());
    }
}

public class Test{
    public static void main(String args[]){
        fun(New.

參考資料:
[1]《Java編程的邏輯》
[2]《Thinking in Java》
[3] https://blog.csdn.net/s10461/...
[4] https://www.cnblogs.com/lwbqq...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/76461.html

相關(guān)文章

  • 好文章必讀 - 收藏集 - 掘金

    摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨(dú)墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計(jì)模式之單例模式 - 掘金前言 作為一個好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過程中不免會去閱讀源碼,這也是一個優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過程中很多人會遇到的障礙,那就是設(shè)計(jì)模式。很多優(yōu)秀的框架會運(yùn)...

    FrozenMap 評論0 收藏0
  • Java開發(fā)

    摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會被提到。將對象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時注解 Java 程序員快速上手 Kot...

    LuDongWei 評論0 收藏0
  • Hollis原創(chuàng)|不了解這12個語法糖,別說你會Java

    摘要:但其實(shí),虛擬機(jī)并不支持這些語法糖。方式為每個泛型類型創(chuàng)建唯一的字節(jié)碼表示,并且將該泛型類型的實(shí)例都映射到這個唯一的字節(jié)碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<