0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java泛型的背景和作用

科技綠洲 ? 來源:業(yè)余草 ? 作者:業(yè)余草 ? 2023-09-20 14:30 ? 次閱讀

Java泛型的背景和作用

Java泛型是Java編程語(yǔ)言中的一個(gè)特性,引入泛型的目的是為了增強(qiáng)代碼的類型安全性和重用性。在沒有泛型之前,Java中的集合類(如ArrayList、HashMap等)只能存儲(chǔ)Object類型的對(duì)象,這使得在使用集合時(shí)需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,容易出現(xiàn)類型錯(cuò)誤。

泛型的背景:在Java 5版本之前,Java的類型是靜態(tài)的,在編譯時(shí)確定,并且在運(yùn)行時(shí)擦除類型信息。這種情況下,編譯器無法對(duì)集合的元素類型進(jìn)行驗(yàn)證,因此可能會(huì)導(dǎo)致運(yùn)行時(shí)類型錯(cuò)誤。為了解決這個(gè)問題,Java引入了泛型機(jī)制。

圖片
Java泛型

「泛型的作用」

  1. 類型安全:泛型使得在編譯時(shí)就能夠檢測(cè)到類型錯(cuò)誤,避免了在運(yùn)行時(shí)出現(xiàn)類型轉(zhuǎn)換異常。
  2. 代碼重用:通過使用泛型,可以編寫通用的代碼,適用于多種不同類型的數(shù)據(jù),提高了代碼的靈活性和復(fù)用性。
  3. API設(shè)計(jì):泛型使得API的設(shè)計(jì)更加清晰和一致,可以定義泛型接口、類和方法,提供更加靈活的參數(shù)類型和返回值類型。
  4. 增強(qiáng)集合類:泛型使集合類更加類型安全和簡(jiǎn)潔,不再需要顯式進(jìn)行類型轉(zhuǎn)換。

在使用泛型時(shí),可以定義類、接口、方法和變量等具有泛型參數(shù),并通過使用具體的類型實(shí)參來指定泛型的具體類型。例如,可以定義一個(gè)泛型類ArrayList,其中的T表示類型參數(shù),可以在創(chuàng)建ArrayList對(duì)象時(shí)指定具體的類型,如ArrayList表示存儲(chǔ)整數(shù)的ArrayList。

泛型的基本概念和好處

基本概念

  • 類型參數(shù):在泛型中,使用類型參數(shù)來表示一個(gè)未知的類型。類型參數(shù)可以用任意標(biāo)識(shí)符來表示,通常使用單個(gè)大寫字母作為慣例,如TE、K等。
  • 實(shí)際類型參數(shù):在使用泛型時(shí),需要指定具體的類型給類型參數(shù),這些具體的類型被稱為實(shí)際類型參數(shù)。例如,在創(chuàng)建一個(gè)泛型類的實(shí)例時(shí),可以將Integer作為實(shí)際類型參數(shù)傳遞給類型參數(shù)T,從而創(chuàng)建一個(gè)存儲(chǔ)整數(shù)的對(duì)象。

好處

  • 類型安全性:泛型提供了更嚴(yán)格的類型檢查,在編譯時(shí)就能夠發(fā)現(xiàn)類型錯(cuò)誤。通過指定具體的類型參數(shù),可以在編譯期間捕獲不兼容的類型操作,避免了在運(yùn)行時(shí)出現(xiàn)類型轉(zhuǎn)換錯(cuò)誤和相關(guān)的異常。
  • 代碼重用性:泛型使得我們可以編寫通用的代碼邏輯,可以在多種類型上進(jìn)行操作,而無需為每種類型都編寫相應(yīng)的代碼。這樣可以減少代碼的重復(fù),提高代碼的可維護(hù)性和可讀性。
  • 高效性:泛型在編譯時(shí)進(jìn)行類型擦除,將泛型類型轉(zhuǎn)換為它們的邊界類型(通常是Object類型)。這意味著在運(yùn)行時(shí)并不需要保留泛型的類型信息,從而避免了額外的開銷,提高了程序的性能。

圖片
泛型

泛型類型和方法

泛型類

定義泛型類的語(yǔ)法和使用方法

在許多編程語(yǔ)言中,如Java和C#,泛型類是一種特殊類型的類,它可以接受不同類型的參數(shù)進(jìn)行實(shí)例化。泛型類提供了代碼重用和類型安全性的好處,因?yàn)樗鼈兛梢耘c各種數(shù)據(jù)類型一起使用,而無需為每種類型編寫單獨(dú)的類。

下面是定義泛型類的語(yǔ)法:

public class GenericClass< T > {
    // 類成員和方法定義
}

在上面的示例中,GenericClass 是一個(gè)泛型類的名稱, 表示類型參數(shù),T 可以替換為任何合法的標(biāo)識(shí)符,用于表示實(shí)際類型。

要使用泛型類,可以通過指定實(shí)際類型來實(shí)例化它。例如,假設(shè)我們有一個(gè)名為 MyClass 的泛型類,我們可以按以下方式使用它:

GenericClass< Integer > myInstance = new GenericClass< Integer >();

在上面的示例中,我們使用整數(shù)類型實(shí)例化了 GenericClass 泛型類。這樣,myInstance 將是一個(gè)只能存儲(chǔ)整數(shù)類型的對(duì)象。

在實(shí)例化泛型類后,可以使用該類中定義的成員和方法,就像普通的類一樣。不同之處在于,泛型類中的成員或方法可以使用類型參數(shù) T,并且會(huì)根據(jù)實(shí)際類型進(jìn)行類型檢查和處理。

如果需要在泛型類中使用多個(gè)類型參數(shù),可以通過逗號(hào)分隔它們:

public class MultiGenericClass< T, U > {
    // 類成員和方法定義
}

上面的示例定義了一個(gè)具有兩個(gè)類型參數(shù)的泛型類 MultiGenericClass

總結(jié)起來,定義泛型類的語(yǔ)法是在類名后面使用 或其他類型參數(shù),并在類中使用這些類型參數(shù)。然后,可以通過指定實(shí)際類型來實(shí)例化泛型類,并可以使用泛型類中定義的成員和方法。

類型參數(shù)的限定和通配符的使用

「類型參數(shù)的限定」

類型參數(shù)的限定允許我們對(duì)泛型類或方法的類型參數(shù)進(jìn)行約束,以確保只能使用特定類型或滿足特定條件的類型。

在 Java 中,可以使用關(guān)鍵字 extends 來限定類型參數(shù)。有兩種類型參數(shù)的限定方式:

  1. 「單一限定(Single Bound)」 :指定類型參數(shù)必須是某個(gè)類或接口的子類。
public class MyClass< T extends SomeClass > {
    // 類成員和方法定義
}

在上面的示例中,類型參數(shù) T 必須是 SomeClass 類的子類或?qū)崿F(xiàn)了 SomeClass 接口的類型。

  1. 「多重限定(Multiple Bounds)」 :指定類型參數(shù)必須是多個(gè)類或接口的子類,并且只能有一個(gè)類(如果有)。
public class MyClass< T extends ClassA & InterfaceB & InterfaceC > {
    // 類成員和方法定義
}

在上面的示例中,類型參數(shù) T 必須是 ClassA 類的子類,并且還要實(shí)現(xiàn) InterfaceBInterfaceC 接口。

通過類型參數(shù)的限定,可以在泛型類或方法中對(duì)類型進(jìn)行更精確的控制和約束,以提高代碼的類型安全性和靈活性。

「通配符的使用」

通配符是一種特殊的類型參數(shù),用于在泛型類或方法中表示未知類型或不確定的類型。有兩種通配符可以使用:

  1. 「無限定通配符(Unbounded Wildcard)」 :使用問號(hào) ? 表示,表示可以匹配任何類型。
public void myMethod(List< ? > myList) {
    // 方法實(shí)現(xiàn)
}

在上面的示例中,myMethod 方法接受一個(gè)類型為 List 的參數(shù),但是該列表的元素類型是未知的,可以是任何類型。

  1. 「有限定通配符(Bounded Wildcard)」 :使用 extends 和具體類或接口來限定通配符所能匹配的類型范圍。
public void myMethod(List< ? extends SomeClass > myList) {
    // 方法實(shí)現(xiàn)
}

在上面的示例中,myMethod 方法接受一個(gè)類型為 List 的參數(shù),但是該列表的元素類型必須是 SomeClass 類或其子類。

通過使用通配符,可以編寫更通用的泛型代碼,允許處理各種類型的參數(shù)。它提供了更大的靈活性,尤其是當(dāng)你不關(guān)心具體類型時(shí)或需要對(duì)多個(gè)類型進(jìn)行操作時(shí)。

需要注意的是,在使用通配符時(shí),不能對(duì)帶有通配符的泛型對(duì)象進(jìn)行添加元素的操作,因?yàn)闊o法確定通配符表示的具體類型。但是可以進(jìn)行讀取元素的操作。如果需要同時(shí)支持添加和讀取操作,可以使用有限定通配符來解決這個(gè)問題。

實(shí)例化泛型類和類型推斷

在Java中,泛型類是能夠?qū)︻愋瓦M(jìn)行參數(shù)化的類。通過使用泛型,我們可以編寫更加通用和可復(fù)用的代碼,同時(shí)提高類型安全性。在實(shí)例化泛型類時(shí),我們需要指定具體的類型參數(shù)。

以下是實(shí)例化泛型類的一般語(yǔ)法:

ClassName< DataType > objectName = new ClassName<  >();

在上面的語(yǔ)法中,ClassName 是泛型類的名稱,DataType 是實(shí)際類型參數(shù)的占位符。通過將適當(dāng)?shù)念愋吞鎿Q為 DataType,我們可以創(chuàng)建一個(gè)特定類型的對(duì)象。例如,如果有一個(gè)泛型類 Box,其中 T 是泛型類型參數(shù),我們可以實(shí)例化它如下:

Box< Integer > integerBox = new Box<  >();

在這個(gè)例子中,我們將泛型類型參數(shù) T 替換為 Integer,然后創(chuàng)建了一個(gè) Box 類型的整數(shù)對(duì)象。

另一方面,類型推斷是指編譯器根據(jù)上下文信息自動(dòng)推斷出泛型類型參數(shù)的過程。在某些情況下,我們可以省略泛型類型參數(shù),并讓編譯器自動(dòng)推斷它們。這樣可以簡(jiǎn)化代碼,使其更具可讀性。

以下是一個(gè)示例,展示了類型推斷的用法:

Box< Integer > integerBox = new Box<  >();  // 類型推斷

List< String > stringList = new ArrayList<  >();  // 類型推斷

在這些示例中,我們沒有顯式地指定泛型類型參數(shù),而是使用了 <> 運(yùn)算符。編譯器會(huì)根據(jù)變量的聲明和初始化值來推斷出正確的類型參數(shù)。

需要注意的是,類型推斷只在Java 7及更高版本中才可用。在舊版本的Java中,必須顯式指定泛型類型參數(shù)。

泛型方法

定義泛型方法的語(yǔ)法和使用方法

泛型方法是指具有泛型類型參數(shù)的方法。通過使用泛型方法,我們可以在方法級(jí)別上使用類型參數(shù),使方法能夠處理不同類型的數(shù)據(jù),并提高代碼的靈活性和復(fù)用性。

以下是定義泛型方法的一般語(yǔ)法:

public < T > ReturnType methodName(T parameter) {
    // 方法體
}

在上面的語(yǔ)法中, 表示類型參數(shù)的占位符,可以是任意標(biāo)識(shí)符(通常使用單個(gè)大寫字母)。T 可以在方法參數(shù)、返回類型和方法體內(nèi)部使用。ReturnType 是方法的返回類型,可以是具體類型或者也可以是泛型類型。

下面是一個(gè)簡(jiǎn)單的示例,展示了如何定義和使用泛型方法:

public < T > void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

// 調(diào)用泛型方法
Integer[] intArray = { 1, 2, 3, 4, 5 };
printArray(intArray);

String[] stringArray = { "Hello", "World" };
printArray(stringArray);

在上面的示例中,我們定義了一個(gè)名為 printArray 的泛型方法。它接受一個(gè)泛型數(shù)組作為參數(shù),并打印出數(shù)組中的每個(gè)元素。我們可以使用這個(gè)方法打印不同類型的數(shù)組,例如整數(shù)數(shù)組和字符串?dāng)?shù)組。

需要注意的是,泛型方法可以獨(dú)立于泛型類存在,并且可以在任何類中定義和使用。它們提供了更大的靈活性,使我們能夠?qū)μ囟ǖ姆椒ㄟM(jìn)行泛型化,而不僅僅是整個(gè)類。

調(diào)用泛型方法和類型推斷

在調(diào)用泛型方法時(shí),我們需要注意幾個(gè)關(guān)鍵點(diǎn):

  1. 顯式指定類型參數(shù):如果泛型方法的類型參數(shù)沒有被編譯器自動(dòng)推斷出來,我們需要顯式地指定類型參數(shù)。可以在方法名前使用尖括號(hào)(<>)并提供具體的類型參數(shù)。
// 顯式指定類型參數(shù)為String
String result = myGenericMethod.< String >genericMethod(argument);
  1. 自動(dòng)類型推斷:Java編譯器在某些情況下能夠自動(dòng)推斷泛型方法的類型參數(shù),使代碼更簡(jiǎn)潔易讀??梢允÷燥@式指定類型參數(shù)。
// 自動(dòng)類型推斷,根據(jù)參數(shù)類型推斷類型參數(shù)為Integer
Integer result = myGenericMethod.genericMethod(argument);

編譯器通過方法參數(shù)的類型和上下文信息來推斷類型參數(shù)。這種類型推斷對(duì)于簡(jiǎn)化代碼和提高可讀性非常有用。

  1. 通配符類型參數(shù):在某些情況下,我們可能希望泛型方法能夠接受不特定類型的參數(shù)。這時(shí)可以使用通配符作為類型參數(shù)。
    • 無限制通配符(Unbounded wildcard):使用問號(hào)(?)表示,可以接受任意類型的參數(shù)。
// 泛型方法接受任意類型的參數(shù)
void myGenericMethod(List< ? > list) {
    // 方法體
}
+   有限制通配符(Bounded wildcard):使用 extends 關(guān)鍵字指定上界或者使用 super 關(guān)鍵字指定下界,限制了泛型方法接受的參數(shù)類型范圍。
// 泛型方法接受 Number 及其子類的參數(shù)
void myGenericMethod(List< ? extends Number > list) {
    // 方法體
}

// 泛型方法接受 Integer 及其父類的參數(shù)
void myGenericMethod(List< ? super Integer > list) {
    // 方法體
}

需要注意的是,調(diào)用泛型方法時(shí),編譯器會(huì)根據(jù)傳遞的參數(shù)類型和上下文進(jìn)行類型檢查。如果類型不匹配,將產(chǎn)生編譯錯(cuò)誤。

泛型接口和通配符

泛型接口

定義泛型接口的語(yǔ)法和使用方法

泛型接口是具有泛型類型參數(shù)的接口。通過使用泛型接口,我們可以在接口級(jí)別上使用類型參數(shù),使得實(shí)現(xiàn)類能夠處理不同類型的數(shù)據(jù),并提高代碼的靈活性和復(fù)用性。

以下是定義泛型接口的一般語(yǔ)法:

public interface InterfaceName< T > {
    // 接口方法和常量聲明
}

在上面的語(yǔ)法中, 表示類型參數(shù)的占位符,可以是任意標(biāo)識(shí)符(通常使用單個(gè)大寫字母)。T 可以在接口方法、常量和內(nèi)部類中使用。

下面是一個(gè)簡(jiǎn)單的示例,展示了如何定義和使用泛型接口:

public interface Box< T > {
    void add(T item);
    T get();
}

// 實(shí)現(xiàn)泛型接口
public class IntegerBox implements Box< Integer > {
    private Integer item;

    public void add(Integer item) {
        this.item = item;
    }

    public Integer get() {
        return item;
    }
}

// 使用泛型接口
Box< Integer > box = new IntegerBox();
box.add(10);
Integer value = box.get();

在上面的示例中,我們定義了一個(gè)名為 Box 的泛型接口。它包含了一個(gè) add 方法和一個(gè) get 方法,分別用于添加和獲取泛型類型的數(shù)據(jù)。然后,我們實(shí)現(xiàn)了這個(gè)泛型接口的一個(gè)具體類 IntegerBox,并在其中指定了具體的類型參數(shù)為 Integer。

最后,我們使用泛型接口創(chuàng)建了一個(gè) Box 類型的對(duì)象,通過 add 方法添加整數(shù)值,并通過 get 方法獲取整數(shù)值。

需要注意的是,實(shí)現(xiàn)泛型接口時(shí)可以選擇具體地指定類型參數(shù),也可以繼續(xù)使用泛型。

實(shí)現(xiàn)泛型接口的方式

  1. 具體類型參數(shù)實(shí)現(xiàn):在實(shí)現(xiàn)類中顯式指定具體的類型參數(shù)。這將使實(shí)現(xiàn)類只能處理特定類型的數(shù)據(jù)。
public class IntegerBox implements Box< Integer > {
    private Integer item;

    public void add(Integer item) {
        this.item = item;
    }

    public Integer get() {
        return item;
    }
}

在上面的示例中,IntegerBox 類實(shí)現(xiàn)了泛型接口 Box,并明確指定了類型參數(shù)為 Integer。因此,IntegerBox 類只能處理整數(shù)類型的數(shù)據(jù)。

  1. 保留泛型類型參數(shù):在實(shí)現(xiàn)類中繼續(xù)使用泛型類型參數(shù)。這將使實(shí)現(xiàn)類具有與泛型接口相同的類型參數(shù),從而保持靈活性。
public class GenericBox< T > implements Box< T > {
    private T item;

    public void add(T item) {
        this.item = item;
    }

    public T get() {
        return item;
    }
}

在上面的示例中,GenericBox 類實(shí)現(xiàn)了泛型接口 Box,并保留了類型參數(shù) T。這意味著 GenericBox 類可以處理任意類型的數(shù)據(jù),具有更大的靈活性。

使用以上兩種方式中的一種,您可以根據(jù)需要選擇實(shí)現(xiàn)泛型接口的方式。具體取決于實(shí)現(xiàn)類在處理數(shù)據(jù)時(shí)需要限定特定類型還是保持靈活性。

另外,無論使用哪種方式來實(shí)現(xiàn)泛型接口,都需要確保實(shí)現(xiàn)類中的方法簽名與泛型接口中定義的方法完全匹配。這包括方法名稱、參數(shù)列表和返回類型。

通配符

上界通配符和下界通配符的概念

「上界通配符(Upper Bounded Wildcard)」

上界通配符用于限制泛型類型參數(shù)必須是指定類型或指定類型的子類。使用 extends 關(guān)鍵字指定上界。

語(yǔ)法:

< ? extends Type >

例如,假設(shè)我們有一個(gè)泛型方法 printList,它接受一個(gè)列表,并打印列表中的元素。但我們希望該方法只能接受 Number 類型或其子類的列表,可以使用上界通配符來實(shí)現(xiàn):

public static void printList(List< ? extends Number > list) {
    for (Number element : list) {
        System.out.println(element);
    }
}

// 調(diào)用示例
List< Integer > integerList = Arrays.asList(1, 2, 3);
printList(integerList); // 可以正常調(diào)用

List< String > stringList = Arrays.asList("Hello", "World");
printList(stringList); // 編譯錯(cuò)誤,String 不是 Number 的子類

在上面的示例中,printList 方法使用 定義了一個(gè)上界通配符,表示方法接受一個(gè) Number 類型或其子類的列表。因此,我們可以傳遞一個(gè) Integer 類型的列表作為參數(shù),但不能傳遞一個(gè) String 類型的列表。

「下界通配符(Lower Bounded Wildcard)」

下界通配符用于限制泛型類型參數(shù)必須是指定類型或指定類型的父類。使用 super 關(guān)鍵字指定下界。

語(yǔ)法:

< ? super Type >

例如,假設(shè)我們有一個(gè)泛型方法 addToList,它接受一個(gè)列表和一個(gè)要添加到列表中的元素。但我們希望該方法只能接受 Object 類型或其父類的元素,可以使用下界通配符來實(shí)現(xiàn):

public static void addToList(List< ? super Object > list, Object element) {
    list.add(element);
}

// 調(diào)用示例
List< Object > objectList = new ArrayList<  >();
addToList(objectList, "Hello");
addToList(objectList, 42);

List< String > stringList = new ArrayList<  >();
addToList(stringList, "World"); // 編譯錯(cuò)誤,String 不是 Object 的父類

在上面的示例中,addToList 方法使用 定義了一個(gè)下界通配符,表示方法接受一個(gè) Object 類型或其父類的列表,并且可以向列表中添加任意類型的元素。因此,我們可以將字符串和整數(shù)添加到 objectList 中,但不能將字符串添加到 stringList 中。

需要注意的是,上界通配符和下界通配符主要用于靈活地處理泛型類型參數(shù),以便在泛型代碼中處理不同類型的數(shù)據(jù)。它們提供了更大的靈活性和復(fù)用性。

在泛型方法和泛型接口中使用通配符的場(chǎng)景

「泛型方法中使用通配符的場(chǎng)景:」

  1. 讀取操作:當(dāng)方法只需要從泛型參數(shù)中獲取值時(shí),可以使用上界通配符 ? extends T,以表示該方法適用于任何 T 類型或其子類。
public static < T > void printList(List< ? extends T > list) {
    for (T element : list) {
        System.out.println(element);
    }
}

// 調(diào)用示例
List< Integer > integerList = Arrays.asList(1, 2, 3);
printList(integerList); // 可以正常調(diào)用

List< String > stringList = Arrays.asList("Hello", "World");
printList(stringList); // 可以正常調(diào)用
  1. 寫入操作:當(dāng)方法需要向泛型參數(shù)中寫入值時(shí),可以使用下界通配符 ? super T,以表示該方法適用于任何 T 類型或其父類。
public static < T > void addToList(List< ? super T > list, T element) {
    list.add(element);
}

// 調(diào)用示例
List< Object > objectList = new ArrayList<  >();
addToList(objectList, "Hello");
addToList(objectList, 42);

List< Number > numberList = new ArrayList<  >();
addToList(numberList, 3.14);
addToList(numberList, 123);

「泛型接口中使用通配符的場(chǎng)景:」

  1. 定義靈活的容器:當(dāng)定義一個(gè)容器類時(shí),希望該容器可以存儲(chǔ)任意類型的數(shù)據(jù),可以使用無限制通配符 。
public interface Container< E > {
    void add(E element);
    E get();
}

// 實(shí)現(xiàn)示例
public class AnyContainer implements Container< ? > {
    private Object element;

    public void add(Object element) {
        this.element = element;
    }

    public Object get() {
        return element;
    }
}
  1. 限制類型范圍:當(dāng)希望泛型接口只能處理特定范圍內(nèi)的類型時(shí),可以使用上界或下界通配符。
public interface Box< T extends Number > {
    void addItem(T item);
    T getItem();
}

// 實(shí)現(xiàn)示例
public class NumberBox< T extends Number > implements Box< T > {
    private T item;

    public void addItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

public class IntegerBox implements Box< Integer > {
    private Integer item;

    public void addItem(Integer item) {
        this.item = item;
    }

    public Integer getItem() {
        return item;
    }
}

上述場(chǎng)景中,使用通配符的目的是提供更大的靈活性和復(fù)用性。通配符允許我們?cè)诜盒头椒ê头盒徒涌谥刑幚矶喾N類型的數(shù)據(jù),而不需要與具體類型綁定。這樣可以使代碼更通用、可擴(kuò)展,并且適用于更廣泛的場(chǎng)景。

泛型和集合框架

泛型集合框架的詳細(xì)介紹

泛型集合框架是Java中提供的一組用于存儲(chǔ)和操作數(shù)據(jù)的容器類,它們支持泛型類型參數(shù)。泛型集合框架在 JDK 中的 java.util 包下提供了豐富的實(shí)現(xiàn),包括列表(List)、集合(Set)、映射(Map)等。

「核心接口:」

  1. List 接口:表示一個(gè)有序的可重復(fù)集合。允許按照索引訪問元素,并可以包含重復(fù)元素。常見的實(shí)現(xiàn)類有 ArrayList、LinkedList 和 Vector。
  2. Set 接口:表示一個(gè)不允許重復(fù)元素的無序集合。保證元素的唯一性。常見的實(shí)現(xiàn)類有 HashSet、TreeSet 和 LinkedHashSet。
  3. Queue 接口:表示一個(gè)先進(jìn)先出(FIFO)的隊(duì)列。常見的實(shí)現(xiàn)類有 LinkedList 和 PriorityQueue。
  4. Map 接口:表示一個(gè)鍵值對(duì)的映射表。每個(gè)鍵都是唯一的,可以使用鍵來獲取相關(guān)聯(lián)的值。常見的實(shí)現(xiàn)類有 HashMap、TreeMap 和 LinkedHashMap。

「泛型的優(yōu)勢(shì):」

泛型集合框架的主要優(yōu)勢(shì)是提供了類型安全和編譯時(shí)類型檢查的功能。通過指定泛型類型參數(shù),我們可以在編譯時(shí)捕獲許多類型錯(cuò)誤,并避免在運(yùn)行時(shí)出現(xiàn)類型轉(zhuǎn)換異常。泛型還提供了更好的代碼可讀性和可維護(hù)性,因?yàn)樗鼈兠鞔_地指定了容器中存儲(chǔ)的元素類型。

「示例用法:」

以下是一些常見的泛型集合框架的示例用法:

// 創(chuàng)建一個(gè)泛型列表,并添加元素
List< String > stringList = new ArrayList<  >();
stringList.add("Hello");
stringList.add("World");

// 使用迭代器遍歷列表
for (String element : stringList) {
    System.out.println(element);
}

// 創(chuàng)建一個(gè)泛型集合,并添加元素
Set< Integer > integerSet = new HashSet<  >();
integerSet.add(1);
integerSet.add(2);
integerSet.add(3);

// 判斷集合是否包含特定元素
boolean containsTwo = integerSet.contains(2);
System.out.println(containsTwo);  // 輸出: true

// 創(chuàng)建一個(gè)鍵值對(duì)映射表,并添加元素
Map< String, Integer > stringToIntegerMap = new HashMap<  >();
stringToIntegerMap.put("One", 1);
stringToIntegerMap.put("Two", 2);
stringToIntegerMap.put("Three", 3);

// 根據(jù)鍵獲取值
int value = stringToIntegerMap.get("Two");
System.out.println(value);  // 輸出: 2

通過使用泛型集合框架,我們可以輕松地創(chuàng)建和操作不同類型的集合,并且在編譯時(shí)獲得類型安全和檢查的好處。

類型擦除和橋方法

類型擦除的原理和影響

泛型類型擦除(Type Erasure)是Java中泛型的實(shí)現(xiàn)方式之一。它是在編譯期間將泛型類型轉(zhuǎn)換為非泛型類型的一種機(jī)制。在泛型類型擦除中,泛型類型參數(shù)被擦除為它們的上界或 Object 類型,并且類型檢查主要發(fā)生在編譯時(shí)而不是運(yùn)行時(shí)。

「泛型類型擦除的原理:」

  1. 類型擦除:在編譯過程中,所有泛型類型參數(shù)都被替換為它們的上界或 Object 類型。例如,List 在編譯后會(huì)變成 `List 。

  2. 類型擦除后的轉(zhuǎn)換:由于類型擦除,原始的泛型類型信息在運(yùn)行時(shí)不可用。因此,在使用泛型類型時(shí),會(huì)進(jìn)行必要的轉(zhuǎn)換來確保類型安全性。

    • 向上轉(zhuǎn)型:如果泛型類型參數(shù)是一個(gè)子類,那么它會(huì)被轉(zhuǎn)換為其上界類型。例如,List 被轉(zhuǎn)換為 List 。

    • 向下轉(zhuǎn)型:如果我們需要從泛型類型中獲取具體的類型參數(shù),我們需要進(jìn)行類型轉(zhuǎn)換。但這可能導(dǎo)致運(yùn)行時(shí)類型異常(ClassCastException)。

    「泛型類型擦除的影響:」

    1. 可兼容性:泛型類型擦除確保了與原始非泛型代碼的兼容性。這意味著可以將使用泛型類型的代碼與不使用泛型的舊代碼進(jìn)行交互。

    2. 無法獲得具體類型參數(shù):由于類型擦除,無法在運(yùn)行時(shí)獲取泛型類型參數(shù)的詳細(xì)信息。例如,無法在運(yùn)行時(shí)判斷一個(gè) List 對(duì)象是 List 還是 List。

    3. 類型安全性:類型擦除導(dǎo)致泛型在運(yùn)行時(shí)失去了類型檢查。編譯器只能在編譯時(shí)進(jìn)行類型檢查,如果存在類型不匹配的情況,可能在運(yùn)行時(shí)出現(xiàn) ClassCastException 異常。

    4. 限制反射操作:通過反射機(jī)制,可以繞過泛型類型擦除的限制,在運(yùn)行時(shí)獲取泛型類型的信息。但是,反射的使用復(fù)雜且性能較低,不推薦頻繁使用。

    「示例影響:」

    以下示例說明了泛型類型擦除的影響:

    // 定義一個(gè)泛型類
    public class GenericClass< T > {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }
    
    public T getValue() {
        return value;
    }
    

    }

    // 使用泛型類
    GenericClass< String > stringGeneric = new GenericClass< >();
    stringGeneric.setValue("Hello");
    String value = stringGeneric.getValue();

    // 編譯后的泛型類型擦除
    GenericClass stringGeneric = new GenericClass();
    stringGeneric.setValue("Hello");
    String value = (String) stringGeneric.getValue(); // 需要進(jìn)行類型轉(zhuǎn)換

    // 運(yùn)行時(shí)類型異常示例
    GenericClass< String > stringGeneric = new GenericClass< >();
    GenericClass< Integer > integerGeneric = new GenericClass< >();

    System.out.println(stringGeneric.getClass() == integerGeneric.getClass()); // 輸出: true

    stringGeneric.setValue("Hello");

    try {
    Integer value = integerGeneric.getValue(); // 運(yùn)行時(shí)拋出 ClassCastException 異常
    } catch (ClassCastException e) {
    System.out.println("ClassCastException: " + e.getMessage());
    }

    橋方法的概念和作用

    泛型橋方法(Generic Bridge Method)是Java編譯器為了保持泛型類型的安全性而自動(dòng)生成的方法。它的作用是在繼承或?qū)崿F(xiàn)帶有泛型類型參數(shù)的類或接口時(shí),確保類型安全性和兼容性。

    「概念:」

    當(dāng)一個(gè)類或接口定義了帶有泛型類型參數(shù)的方法,并且該類或接口被子類或?qū)崿F(xiàn)類繼承或?qū)崿F(xiàn)時(shí),由于泛型類型擦除的原因,編譯器需要生成額外的橋方法來確保類型安全性。這些橋方法具有相同的方法簽名,但使用原始類型作為參數(shù)和返回值類型,以保持與繼承層次結(jié)構(gòu)中的其他非泛型方法的兼容性。

    「作用:」

    1. 類型安全:泛型橋方法的主要作用是保持類型安全性。通過添加橋方法,可以在運(yùn)行時(shí)防止對(duì)不兼容的類型進(jìn)行訪問。這樣可以避免在編譯期間無法檢測(cè)到的類型錯(cuò)誤。

    2. 維護(hù)繼承關(guān)系:泛型橋方法還用于維護(hù)泛型類或接口之間的繼承關(guān)系。它們確保子類或?qū)崿F(xiàn)類能夠正確地覆蓋父類或接口的泛型方法,并使用正確的類型參數(shù)。

    「示例:」

    考慮以下示例:

    public class MyList< T > {
    public void add(T element) {
    // 添加元素的邏輯
    }
    }

    // 子類繼承泛型類,并覆蓋泛型方法
    public class StringList extends MyList< String > {
    @Override
    public void add(String element) {
    // 添加元素的邏輯
    }
    }

    在這個(gè)示例中,由于Java的泛型類型擦除機(jī)制,編譯器會(huì)生成一個(gè)橋方法來確保類型安全性和兼容性。上述代碼實(shí)際上被編譯器轉(zhuǎn)換為以下內(nèi)容:

    public class MyList {
    public void add(Object element) {
    // 添加元素的邏輯
    }
    }

    public class StringList extends MyList {
    @Override
    public void add(Object element) {
    add((String) element);
    }

    public void add(String element) {
        // 添加元素的邏輯
    }
    

    }

    在這個(gè)轉(zhuǎn)換后的代碼中,StringList 類包含了一個(gè)橋方法 add(Object element),它調(diào)用了真正的泛型方法 add(String element)。這樣就保持了類型安全性,并且與父類的非泛型方法兼容。

    通過生成泛型橋方法,Java編譯器可以在繼承和實(shí)現(xiàn)泛型類型時(shí)保持類型安全性和兼容性。這些橋方法在內(nèi)部轉(zhuǎn)換和維護(hù)泛型類型擦除的同時(shí),提供了更好的類型檢查和運(yùn)行時(shí)類型安全性。

    泛型的局限性和注意事項(xiàng)

    泛型中的類型安全性和運(yùn)行時(shí)異常

    在泛型中,類型安全性是指編譯器對(duì)類型進(jìn)行檢查以確保程序在運(yùn)行時(shí)不會(huì)出現(xiàn)類型錯(cuò)誤。通過使用泛型,可以在編譯時(shí)捕獲許多類型錯(cuò)誤,并避免在運(yùn)行時(shí)出現(xiàn)類型轉(zhuǎn)換異常。

    「類型安全性的優(yōu)勢(shì):」

    1. 編譯時(shí)類型檢查:Java編譯器對(duì)泛型進(jìn)行類型檢查,以確保代碼的類型安全性。它可以驗(yàn)證泛型類型參數(shù)是否與聲明的類型參數(shù)匹配,并拒絕不正確的類型操作。

    2. 避免強(qiáng)制類型轉(zhuǎn)換:在使用泛型時(shí),不再需要手動(dòng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,因?yàn)榫幾g器可以自動(dòng)插入類型轉(zhuǎn)換代碼。

    3. 提高代碼可讀性和可維護(hù)性:通過使用泛型,可以明確指定容器中存儲(chǔ)的元素類型,使代碼更易讀和理解。它也可以提供更好的代碼維護(hù)性,因?yàn)轭愋托畔⑹秋@式的。

    「類型安全性的實(shí)現(xiàn):」

    1. 編譯期類型檢查:編譯器會(huì)對(duì)泛型進(jìn)行類型檢查,以確保在編譯時(shí)不會(huì)出現(xiàn)類型錯(cuò)誤。如果存在類型不匹配的情況,編譯器會(huì)報(bào)告錯(cuò)誤并阻止代碼的編譯。

    2. 類型擦除機(jī)制:Java中的泛型是通過類型擦除實(shí)現(xiàn)的,即在編譯時(shí)將泛型類型擦除為原始類型(如 Object)。類型擦除確保了與原始非泛型代碼的兼容性,并且可以維護(hù)向后兼容性。

    3. 橋方法:為了維護(hù)泛型類和接口之間的繼承關(guān)系和類型安全性,編譯器會(huì)生成橋方法。橋方法用于在繼承或?qū)崿F(xiàn)帶有泛型類型參數(shù)的類或接口時(shí),確保正確的類型轉(zhuǎn)換和方法調(diào)用。

    「運(yùn)行時(shí)異常:」

    盡管泛型增強(qiáng)了類型安全性,但在某些情況下仍可能發(fā)生運(yùn)行時(shí)異常。這些異常通常發(fā)生在以下情況:

    1. 類型擦除引起的信息丟失:由于類型擦除,無法在運(yùn)行時(shí)獲取泛型類型參數(shù)的詳細(xì)信息。因此,在進(jìn)行類型轉(zhuǎn)換時(shí),如果類型不匹配,可能會(huì)導(dǎo)致 ClassCastException 異常。

    2. 與原始類型交互:如果使用原始類型與泛型類型進(jìn)行交互,例如將泛型集合賦值給未經(jīng)參數(shù)化的集合,可能會(huì)在編譯時(shí)沒有警告,但在運(yùn)行時(shí)會(huì)導(dǎo)致類型錯(cuò)誤。

    3. 反射操作:通過反射機(jī)制,可以繞過泛型的類型安全性。在使用反射時(shí),需要額外的注意,以避免類型錯(cuò)誤和運(yùn)行時(shí)異常。

    「示例:」

    List< String > stringList = new ArrayList<  >();
    stringList.add("Hello");
    stringList.add("World");

    // 編譯時(shí)類型檢查,不允許添加非 String 類型的元素
    stringList.add(123); // 編譯錯(cuò)誤

    // 獲取元素時(shí)不需要進(jìn)行類型轉(zhuǎn)換
    String firstElement = stringList.get(0);

    // 迭代器遍歷時(shí)可以確保元素類型的安全性
    for (String element : stringList) {
    System.out.println(element);
    }

    // 類型擦除引起的運(yùn)行時(shí)異常示例
    List< Integer > integerList = new ArrayList< >();
    integerList.add(10);

    List rawList = integerList; // 原始類型與泛型類型交互

    List< String > stringList = rawList; // 編譯通過,但在運(yùn)行時(shí)會(huì)導(dǎo)致類型錯(cuò)誤

    String firstElement = stringList.get(0); // 運(yùn)行時(shí)拋出 ClassCastException 異常

    在這個(gè)示例中,原始類型 rawList 在編譯時(shí)可以與泛型類型 List 相互賦值。但在運(yùn)行時(shí),當(dāng)我們嘗試從 stringList 中獲取元素時(shí),由于類型擦除并且實(shí)際存儲(chǔ)的是整數(shù)類型,會(huì)導(dǎo)致 ClassCastException 異常。

    因此,盡管泛型提供了類型安全性和編譯時(shí)類型檢查的優(yōu)勢(shì),但仍需小心處理類型擦除和與原始類型的交互,以避免可能的運(yùn)行時(shí)異常。

    泛型數(shù)組的限制和解決方案

    泛型數(shù)組是指使用泛型類型參數(shù)創(chuàng)建的數(shù)組。然而,Java中存在一些限制,不允許直接創(chuàng)建具有泛型類型參數(shù)的數(shù)組。這是由于Java泛型的類型擦除機(jī)制導(dǎo)致的。

    「限制:」

    1. 無法創(chuàng)建具有泛型類型參數(shù)的數(shù)組:在Java中,不能直接創(chuàng)建具有泛型類型參數(shù)的數(shù)組,例如 List[] 或者 T[]。

    2. 編譯器警告:如果嘗試創(chuàng)建一個(gè)泛型數(shù)組,編譯器會(huì)發(fā)出警告,提示“泛型數(shù)組創(chuàng)建可能引起未經(jīng)檢查或不安全的操作”。

    「問題原因:」

    泛型的類型擦除機(jī)制是導(dǎo)致不能直接創(chuàng)建泛型數(shù)組的主要原因。泛型在編譯時(shí)被擦除為原始類型,因此無法在運(yùn)行時(shí)獲取泛型類型的具體信息。這就導(dǎo)致了無法確定數(shù)組的確切類型。

    「解決方案:」

    雖然直接創(chuàng)建具有泛型類型參數(shù)的數(shù)組是受限制的,但可以通過以下兩種解決方案來處理泛型數(shù)組的問題:

    「1. 使用通配符或原始類型數(shù)組:」

    可以使用通配符(?)或原始類型數(shù)組來代替具體的泛型類型參數(shù)。例如,可以創(chuàng)建 List[] 或者 Object[] 類型的數(shù)組。這種方式雖然不會(huì)得到類型安全性,但可以繞過編譯時(shí)的限制。

    List< ? >[] arrayOfLists = new List< ? >[5];
    Object[] objects = new Object[5];

    需要注意的是,由于無法確定數(shù)組的確切類型,因此在訪問數(shù)組元素時(shí)可能需要進(jìn)行顯式的類型轉(zhuǎn)換。

    「2. 使用集合或其他數(shù)據(jù)結(jié)構(gòu):」

    可以使用集合(如 ArrayListLinkedList 等)或其他數(shù)據(jù)結(jié)構(gòu)代替數(shù)組來存儲(chǔ)泛型類型參數(shù)。這樣可以避免直接使用泛型數(shù)組帶來的限制和問題。

    List List String >> listOfLists = new ArrayList  >();

    使用集合的好處是它們提供了更靈活的操作和類型安全性,并且不受泛型數(shù)組的限制。

    泛型和反射的兼容性問題

    泛型和反射之間存在一些兼容性問題,這是由于Java泛型的類型擦除機(jī)制和反射的特性所導(dǎo)致的。

    「1. 類型擦除導(dǎo)致的信息丟失:」 泛型在Java中是通過類型擦除實(shí)現(xiàn)的,即在運(yùn)行時(shí),泛型類型參數(shù)會(huì)被擦除為原始類型(如 Object)。這意味著在使用反射時(shí),無法獲取泛型類型參數(shù)的具體信息,只能得到原始類型。

    「解決方案:」 可以使用反射操作獲取泛型類、泛型方法或泛型字段的元數(shù)據(jù)(例如名稱、修飾符、泛型參數(shù)等),但無法準(zhǔn)確獲得泛型類型參數(shù)的具體類型。在某些情況下,可以結(jié)合使用泛型標(biāo)記接口來傳遞類型信息,從而在反射操作中獲取更多的類型信息。

    「2. 泛型數(shù)組的限制:」 無法直接創(chuàng)建具有泛型類型參數(shù)的數(shù)組。這是由于類型擦除機(jī)制導(dǎo)致的,無法在運(yùn)行時(shí)確定泛型類型參數(shù)的具體類型。

    「解決方案:」 可以通過使用通配符(?)或原始類型數(shù)組來代替具體泛型類型參數(shù)的數(shù)組。然而,在訪問數(shù)組元素時(shí)可能需要進(jìn)行顯式的類型轉(zhuǎn)換。

    「3. 泛型方法的反射調(diào)用:」 反射調(diào)用泛型方法時(shí)需要注意類型安全性。由于反射操作是在運(yùn)行時(shí)動(dòng)態(tài)執(zhí)行的,編譯器無法進(jìn)行靜態(tài)類型檢查,因此可能會(huì)導(dǎo)致類型錯(cuò)誤。

    「解決方案:」 在使用反射調(diào)用泛型方法時(shí),可以通過傳遞正確的參數(shù)類型來確保類型安全性,并對(duì)返回值進(jìn)行合適的類型轉(zhuǎn)換。

    「4. Class 對(duì)象的泛型信息限制:」 對(duì)于具體的泛型類型,無法通過 Class 對(duì)象獲取其泛型類型參數(shù)的具體信息。例如,對(duì)于 List 類型,無法直接從 List.class 中獲取到泛型類型參數(shù)為 String 的信息。

    「解決方案:」 可以使用 TypeToken 類庫(kù)等第三方庫(kù)來繞過該限制。TypeToken 可以通過子類化和匿名內(nèi)部類的方式捕獲泛型類型參數(shù)的具體信息。

    泛型編程實(shí)踐和最佳實(shí)踐

    泛型編程常見模式和技巧

    「1. 泛型類和接口:」 定義帶有類型參數(shù)的泛型類或接口,可以使代碼適用于不同類型的數(shù)據(jù)。通過在類或接口中使用類型參數(shù),可以在實(shí)例化時(shí)指定具體的類型。

    public class GenericClass< T > {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }
    
    public T getValue() {
        return value;
    }
    

    }

    「2. 泛型方法:」 定義帶有類型參數(shù)的泛型方法,可以使方法在調(diào)用時(shí)根據(jù)傳入的參數(shù)類型進(jìn)行類型推斷,并返回相應(yīng)的類型。

    public < T > T genericMethod(T value) {
    // 方法邏輯
    return value;
    }

    「3. 通配符:」 使用通配符(?)可以表示未知類型或限定類型范圍,增加代碼的靈活性。

    • 無界通配符:List 表示可以存儲(chǔ)任意類型的 List。

    • 上界通配符:List 表示可以存儲(chǔ) Number 及其子類的 List。

    • 下界通配符:List 表示可以存儲(chǔ) Integer 及其父類的 List。

    「4. 類型限定和約束:」 使用類型限定和約束可以限制泛型類型參數(shù)的范圍,提供更精確的類型信息。

    public < T extends Number > void processNumber(T number) {
    // 方法邏輯
    }

    「5. 泛型與繼承關(guān)系:」 泛型類和接口可以繼承、實(shí)現(xiàn)其他泛型類和接口,通過繼承關(guān)系可以構(gòu)建更豐富的泛型層次結(jié)構(gòu)。

    public interface MyInterface< T > {
    // 接口定義
    }

    public class MyClass< T > implements MyInterface< T > {
    // 類定義
    }

    「6. 泛型數(shù)組和集合:」 使用泛型數(shù)組和集合可以處理不同類型的數(shù)據(jù)集合,提供更安全和靈活的數(shù)據(jù)存儲(chǔ)和操作方式。

    List< String > stringList = new ArrayList<  >();
    stringList.add("Hello");
    stringList.add("World");

    String value = stringList.get(0); // 獲取元素,無需轉(zhuǎn)換類型

    「7. 類型推斷:」 Java 7 引入的鉆石操作符(<>)可以根據(jù)上下文自動(dòng)推斷類型參數(shù),使代碼更簡(jiǎn)潔。

    Map< String, List< Integer >> map = new HashMap<  >();  // 類型推斷

    避免常見的泛型錯(cuò)誤和陷阱

    「1. 混淆原始類型和泛型類型:」 在使用泛型時(shí),應(yīng)確保正確區(qū)分原始類型和泛型類型。原始類型不具有類型參數(shù),并喪失了泛型的好處。

    「避免方法:」 使用泛型類型參數(shù)聲明類、接口和方法,并在代碼中明確指定類型參數(shù)。

    「2. 忽略類型檢查警告:」 在使用泛型時(shí),編譯器可能會(huì)生成類型檢查警告,如果忽略這些警告,可能導(dǎo)致類型安全問題。

    「避免方法:」 盡量避免直接忽略類型檢查警告,可以通過合理的類型限定、類型轉(zhuǎn)換或使用 @SuppressWarnings 注解來解決或抑制警告。

    「3. 創(chuàng)建泛型數(shù)組:」 無法直接創(chuàng)建泛型數(shù)組,因?yàn)镴ava中的數(shù)組具有固定的類型(協(xié)變性)。如果嘗試創(chuàng)建泛型數(shù)組,可能會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤或運(yùn)行時(shí)異常。

    「避免方法:」 可以使用通配符或原始類型數(shù)組代替具體的泛型數(shù)組。例如,使用 ListList 代替 List。

    「4. 泛型類型擦除:」 在運(yùn)行時(shí),泛型類型參數(shù)會(huì)被擦除為原始類型(如 Object),導(dǎo)致無法獲取泛型類型參數(shù)的具體信息。

    「避免方法:」 可以通過傳遞類型標(biāo)記或使用第三方庫(kù)(如 TypeToken)來繞過泛型類型擦除問題,從而獲取更多的類型信息。

    「5. 靜態(tài)上下文中的泛型:」 靜態(tài)字段、靜態(tài)方法和靜態(tài)初始化塊不能引用泛型類型參數(shù),因?yàn)樗鼈冊(cè)陬惣虞d時(shí)就存在,并且與實(shí)例化無關(guān)。

    「避免方法:」 如果需要在靜態(tài)上下文中使用泛型類型,可以將泛型參數(shù)聲明為靜態(tài)方法內(nèi)部的局部變量。

    「6. 范型和可變參數(shù)方法:」 當(dāng)調(diào)用可變參數(shù)方法時(shí),在泛型方法中使用 語(yǔ)法可能會(huì)導(dǎo)致編譯錯(cuò)誤。

    「避免方法:」 可以使用邊界類型通配符(T[]List)作為參數(shù)類型,或者使用非泛型類型參數(shù)。

    「7. 泛型類型參數(shù)的邊界限定:」 當(dāng)泛型類型參數(shù)受到邊界限定時(shí),要注意在代碼中合理使用這些限制,并防止類型轉(zhuǎn)換錯(cuò)誤。

    「避免方法:」 在合適的情況下,使用邊界限定來約束泛型類型參數(shù),并在代碼中根據(jù)邊界類型進(jìn)行相應(yīng)的操作和轉(zhuǎn)換。

    `

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4226

    瀏覽量

    85575
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104479
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1929

    瀏覽量

    34539
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解Rust的

    所有的編程語(yǔ)言都致力于將重復(fù)的任務(wù)簡(jiǎn)單化,并為此提供各種各樣的工具。在 Rust 中,(generics)就是這樣一種工具,它是具體類型或其它屬性的抽象替代。在編寫代碼時(shí),我們可以直接描述
    發(fā)表于 11-12 09:08 ?1041次閱讀

    Golang的使用

    眾所周知很多語(yǔ)言的function 中都支持 key=word 關(guān)鍵字參數(shù), 但 golang 是不支持的, 我們可以利用去簡(jiǎn)單的實(shí)現(xiàn)。
    發(fā)表于 08-16 12:24 ?260次閱讀

    Java知識(shí):_(_)自定義(_較高要求)#Java

    JAVA
    學(xué)習(xí)電子
    發(fā)布于 :2022年11月16日 02:22:04

    Java基礎(chǔ)知識(shí):通配符#Java

    JAVA
    學(xué)習(xí)硬聲知識(shí)
    發(fā)布于 :2022年11月16日 18:27:14

    labview連接mongdb問題,找到不.NET類中的

    有沒有人用labview連接mongodb數(shù)據(jù)庫(kù)的?已下載mongodb的c#驅(qū)動(dòng),利用labview中的.net控件調(diào)用相關(guān)函數(shù),但是驅(qū)動(dòng)中有部分函數(shù)在類中, labview能調(diào)用c#中的
    發(fā)表于 04-08 13:38

    詳細(xì)介紹了Java、注解、并發(fā)編程

    介紹了Java、注解、并發(fā)編程、數(shù)據(jù)傳輸與序列化、高效IO、容器集合、反射與類加載以及JVM重點(diǎn)知識(shí)線程、內(nèi)存模型、JVM運(yùn)行時(shí)內(nèi)存、垃圾回收與算法、Java中四種引用類型、GC
    發(fā)表于 08-20 06:09

    冒泡排序法的實(shí)現(xiàn)

    冒泡排序法的實(shí)現(xiàn),自用筆記!
    發(fā)表于 01-20 07:22

    C語(yǔ)言編程是如何實(shí)現(xiàn)對(duì)數(shù)組中元素的線性搜索的

    C語(yǔ)言編程,實(shí)現(xiàn)對(duì)數(shù)組中元素的線性搜索。
    發(fā)表于 01-20 06:36

    iOS中關(guān)于的解析

    文章圍繞這五點(diǎn): 1. 是什么 2. 為什么要用 3. 怎么用 4.
    發(fā)表于 09-25 10:01 ?0次下載

    關(guān)于Java變量的作用域分析

    目錄 1.靜態(tài)作用域與動(dòng)態(tài)作用域 2.變量的作用域 3.Java 中變量的作用域 4.Java
    發(fā)表于 09-25 16:28 ?0次下載

    java 編程

    一。 概念的提出(為什么需要)? 首先,我們看下下面這段簡(jiǎn)短的代碼: publicclassGenericTest { publicstaticvoidmain(String[
    發(fā)表于 09-27 11:15 ?0次下載

    聊聊java實(shí)現(xiàn)的原理與好處

    摘要: 和C++以模板來實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為
    發(fā)表于 09-27 16:50 ?0次下載

    Java的工作原理和案例

    Java語(yǔ)言一個(gè)非常重要的概念,在Java集合類框架中被廣泛應(yīng)用。在介紹之前先看一個(gè)例
    的頭像 發(fā)表于 07-01 10:14 ?2620次閱讀

    Java Agent的作用及原理

    Java Agent相關(guān)的信息。下面給大家盤一盤Java Agent! 1 Java Agent的作用 Java Agent是
    的頭像 發(fā)表于 10-10 15:53 ?1617次閱讀
    <b class='flag-5'>Java</b> Agent的<b class='flag-5'>作用</b>及原理

    C語(yǔ)言是否支持編程?

    C語(yǔ)言是否支持編程?毫無疑問,答案是不支持。
    的頭像 發(fā)表于 10-16 10:02 ?617次閱讀