国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java? 教程(泛型通配符)

qingshanli1988 / 771人閱讀

泛型通配符

在泛型代碼中,稱為通配符的問號()表示未知類型,通配符可用于各種情況:作為參數、字段或局部變量的類型,有時作為返回類型(盡管更好的編程實踐是更加具體),通配符從不用作泛型方法調用、泛型類實例創建或超類型的類型參數。

以下部分更詳細地討論通配符,包括上界通配符、下界通配符和通配符捕獲。

上界通配符

你可以使用上界通配符來放寬對變量的限制,例如,假設你要編寫一個適用于ListListList的方法,你可以通過使用上界通配符來實現這一點。

要聲明一個上界通配符,請使用通配符("?"),后跟extends關鍵字,后跟上界,請注意,在此上下文中,extends在一般意義上用于表示“extends”(如在類中)或“implements”(如在接口中)。

要編寫適用于NumberNumber的子類型列表的方法,例如IntegerDoubleFloat,你可以指定List<?extends Number>,List一詞比List更具限制性,因為前者只匹配Number類型的列表,而后者匹配Number類型或其任何子類的列表。

考慮以下process方法:

public static void process(List list) { /* ... */ }

上界通配符,其中Foo是任何類型,匹配FooFoo的任何子類型,process方法可以像Foo類型一樣訪問列表元素:

public static void process(List list) {
    for (Foo elem : list) {
        // ...
    }
}

foreach子句中,elem變量遍歷列表中的每個元素,現在可以在elem上使用Foo類中定義的任何方法。

sumOfList方法返回列表中數字的總和:

public static double sumOfList(List list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

以下代碼使用Integer對象列表打印sum = 6.0

List li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));

Double值列表可以使用相同的sumOfList方法,以下代碼打印sum = 7.0

List ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));
無界通配符

使用通配符(?)指定無界通配符類型,例如List,這稱為未知類型的列表,有兩種情況,無界通配符是一種有用的方法:

如果你正在編寫可以使用Object類中提供的功能實現的方法。

當代碼使用泛型類中不依賴于類型參數的方法時,例如,List.sizeList.clear,事實上,經常使用Class,因為Class中的大多數方法都不依賴于T

考慮以下方法,printList

public static void printList(List list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

printList的目標是打印任何類型的列表,但它無法實現該目標 — 它只打印一個Object實例列表,它不能打印List、ListList等,因為它們不是List的子類型,要編寫通用的printList方法,請使用List

public static void printList(List list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

因為對于任何具體類型A,ListList的子類型,你可以使用printList打印任何類型的列表:

List li = Arrays.asList(1, 2, 3);
List  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);
在本課程的示例中使用了Arrays.asList方法,此靜態工廠方法轉換指定的數組并返回固定大小的列表。

重要的是要注意ListList是不一樣的,你可以將ObjectObject的任何子類型插入List,但是你只能在List中插入null,通配符使用指南部分提供了有關如何確定在給定情況下應使用哪種通配符(如果有)的更多信息。

下界通配符

上界通配符部分顯示上界通配符將未知類型限制為該類型的特定類型或子類型,并使用extends關鍵字表示,以類似的方式,下界通配符將未知類型限制為該類型的特定類型或超類型。

使用通配符(?)表示下界通配符,后跟super關鍵字,后跟下界:

你可以指定通配符的上界,也可以指定下界限,但不能同時指定兩者。

假設你要編寫一個將Integer對象放入列表的方法,為了最大限度地提高靈活性,你希望該方法可以處理List、ListList — 任何可以保存Integer值的方法。

要編寫適用于IntegerInteger超類型列表的方法,例如IntegerNumberObject,你可以指定List,List一詞比List更具限制性,因為前者僅匹配Integer類型的列表,而后者匹配任何類型為Integer的超類型的列表。

以下代碼將數字1到10添加到列表的末尾:

public static void addNumbers(List list) {
    for (int i = 1; i <= 10; i++) {
        list.add(i);
    }
}
通配符和子類型

如泛型、繼承和子類型中所述,泛型類或接口不相關,僅僅因為他們的類型之間存在關系,但是,你可以使用通配符在泛型類或接口之間創建關系。

給定以下兩個常規(非泛型)類:

class A { /* ... */ }
class B extends A { /* ... */ }

編寫以下代碼是合理的:

B b = new B();
A a = b;

此示例顯示常規類的繼承遵循此子類型規則:如果B擴展A,則B類是A類的子類型,此規則不適用于泛型類型:

List lb = new ArrayList<>();
List la = lb;   // compile-time error

假設IntegerNumber的子類型,ListList之間的關系是什么?

雖然IntegerNumber的子類型,但List不是List的子類型,事實上,這兩種類型不相關,ListList的公共父級是List。

為了在這些類之間創建關系以便代碼可以通過List的元素訪問Number的方法,請使用上界的通配符:

List intList = new ArrayList<>();
List  numList = intList;  // OK. List is a subtype of List

因為IntegerNumber的子類型,而numListNumber對象的列表,所以intListInteger對象列表)和numList之間現在存在關系,下圖顯示了使用上界和下界通配符聲明的多個List類之間的關系。

上一篇:類型推斷 下一篇:泛型通配符捕獲和Helper方法

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72943.html

相關文章

  • Java? 教程(目錄)

    Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續版本中引入的改進。 Java教程是希望使用Java編程語言創建應用程序的程序員的實用指南,其中包括數百個完整的工作示例和數十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發軟件并使用...

    lifesimple 評論0 收藏0
  • Java? 教程泛型配符捕獲和Helper方法)

    泛型通配符捕獲和Helper方法 在某些情況下,編譯器會推斷出通配符的類型,例如,列表可以定義為List,但是在評估表達式時,編譯器會從代碼中推斷出特定類型,此場景稱為通配符捕獲。 在大多數情況下,你不必擔心通配符捕獲,除非你看到包含短語capture of的錯誤消息。 WildcardError示例在編譯時產生捕獲錯誤: import java.util.List; public class ...

    ChristmasBoy 評論0 收藏0
  • Java? 教程泛型配符使用指南)

    泛型通配符使用指南 學習使用泛型編程時更困惑的一個方面是確定何時使用上界通配符以及何時使用下界通配符,此頁面提供了設計代碼時要遵循的一些準則。 對于本文的討論,將變量看作提供的兩個功能之一是有幫助的: 一個In變量 in變量向代碼提供數據,想象一下帶有兩個參數的復制方法:copy(src, dest),src參數提供要復制的數據,因此它是in參數。 一個Out變量 out變量保存數據以供其他地方使...

    raledong 評論0 收藏0
  • Java? 教程泛型的限制)

    泛型的限制 要有效地使用Java泛型,必須考慮以下限制: 無法使用基元類型實例化泛型類型 無法創建類型參數的實例 無法聲明類型為類型參數的靜態字段 無法對參數化類型使用強制類型轉換或instanceof 無法創建參數化類型的數組 無法創建、捕獲或拋出參數化類型的對象 無法重載將每個重載的形式參數類型擦除為相同原始類型的方法 無法使用基元類型實例化泛型類型 考慮以下參數化類型: class P...

    Bowman_han 評論0 收藏0
  • Java? 教程泛型、繼承和子類型)

    泛型、繼承和子類型 如你所知,只要類型兼容,就可以將一種類型的對象分配給另一種類型的對象,例如,你可以將Integer分配給Object,因為Object是Integer的超類型之一: Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // OK ...

    AaronYuan 評論0 收藏0

發表評論

0條評論

qingshanli1988

|高級講師

TA的文章

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