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

資訊專欄INFORMATION COLUMN

Java? 教程(泛型通配符捕獲和Helper方法)

ChristmasBoy / 3722人閱讀

泛型通配符捕獲和Helper方法

在某些情況下,編譯器會推斷出通配符的類型,例如,列表可以定義為List,但是在評估表達式時,編譯器會從代碼中推斷出特定類型,此場景稱為通配符捕獲。

在大多數(shù)情況下,你不必擔心通配符捕獲,除非你看到包含短語“capture of”的錯誤消息。

WildcardError示例在編譯時產生捕獲錯誤:

import java.util.List;

public class WildcardError {

    void foo(List i) {
        i.set(0, i.get(0));
    }
}

在此示例中,編譯器將i輸入?yún)?shù)處理為Object類型,當foo方法調用List.set(int, E)時,編譯器無法確認插入到列表中的對象的類型,并且會產生錯誤,發(fā)生此類錯誤時,通常意味著編譯器認為你為變量分配了錯誤的類型,出于這個原因,泛型被添加到Java語言中 — 在編譯時強制執(zhí)行類型安全。

由Oracle的JDK 7 javac實現(xiàn)編譯時,WildcardError示例生成以下錯誤:

WildcardError.java:6: error: method set in interface List cannot be applied to given types;
    i.set(0, i.get(0));
     ^
  required: int,CAP#1
  found: int,Object
  reason: actual argument Object cannot be converted to CAP#1 by method invocation conversion
  where E is a type-variable:
    E extends Object declared in interface List
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
1 error

在此示例中,代碼嘗試執(zhí)行安全操作,那么如何解決編譯器錯誤?你可以通過編寫捕獲通配符的私有Helper方法來修復它,在這種情況下,你可以通過創(chuàng)建私有Helper方法fooHelper來解決此問題,如WildcardFixed中所示:

public class WildcardFixed {

    void foo(List i) {
        fooHelper(i);
    }


    // Helper method created so that the wildcard can be captured
    // through type inference.
    private  void fooHelper(List l) {
        l.set(0, l.get(0));
    }

}

由于Helper方法,編譯器使用推斷來確定T是調用中的CAP#1(捕獲變量),該示例現(xiàn)在成功編譯。

按照慣例,Helper方法通常命名為originalMethodNameHelper

現(xiàn)在考慮一個更復雜的例子,WildcardErrorBad

import java.util.List;

public class WildcardErrorBad {

    void swapFirst(List l1, List l2) {
      Number temp = l1.get(0);
      l1.set(0, l2.get(0)); // expected a CAP#1 extends Number,
                            // got a CAP#2 extends Number;
                            // same bound, but different types
      l2.set(0, temp);        // expected a CAP#1 extends Number,
                            // got a Number
    }
}

在這個例子中,代碼正在嘗試不安全的操作,例如,考慮以下對swapFirst方法的調用:

List li = Arrays.asList(1, 2, 3);
List  ld = Arrays.asList(10.10, 20.20, 30.30);
swapFirst(li, ld);

ListList都符合List的標準,從Integer值列表中獲取項目并嘗試將其放入Double值列表中顯然是不正確的。

使用Oracle的JDK javac編譯器編譯代碼會產生以下錯誤:

WildcardErrorBad.java:7: error: method set in interface List cannot be applied to given types;
      l1.set(0, l2.get(0)); // expected a CAP#1 extends Number,
        ^
  required: int,CAP#1
  found: int,Number
  reason: actual argument Number cannot be converted to CAP#1 by method invocation conversion
  where E is a type-variable:
    E extends Object declared in interface List
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Number from capture of ? extends Number
WildcardErrorBad.java:10: error: method set in interface List cannot be applied to given types;
      l2.set(0, temp);      // expected a CAP#1 extends Number,
        ^
  required: int,CAP#1
  found: int,Number
  reason: actual argument Number cannot be converted to CAP#1 by method invocation conversion
  where E is a type-variable:
    E extends Object declared in interface List
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Number from capture of ? extends Number
WildcardErrorBad.java:15: error: method set in interface List cannot be applied to given types;
        i.set(0, i.get(0));
         ^
  required: int,CAP#1
  found: int,Object
  reason: actual argument Object cannot be converted to CAP#1 by method invocation conversion
  where E is a type-variable:
    E extends Object declared in interface List
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
3 errors

這里沒有Helper方法來解決這個問題,因為代碼根本就是錯誤的。

上一篇:泛型通配符

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

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

相關文章

  • Java? 教程(目錄)

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

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

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

    Bowman_han 評論0 收藏0
  • Java? 教程泛型配符

    泛型通配符 在泛型代碼中,稱為通配符的問號(?)表示未知類型,通配符可用于各種情況:作為參數(shù)、字段或局部變量的類型,有時作為返回類型(盡管更好的編程實踐是更加具體),通配符從不用作泛型方法調用、泛型類實例創(chuàng)建或超類型的類型參數(shù)。 以下部分更詳細地討論通配符,包括上界通配符、下界通配符和通配符捕獲。 上界通配符 你可以使用上界通配符來放寬對變量的限制,例如,假設你要編寫一個適用于List、List和...

    qingshanli1988 評論0 收藏0
  • Java泛型中的配符

    摘要:好了,有了這樣的背景知識,我們可以來看一下上界通配了,在中,可以使用來界定一個上界,的意思是所有屬于的子類,是上界,不能突破天界啊,我們具體化一下,的意思就是,所有的子類都可以匹配這個通配符。 1、上界通配符 首先,需要知道的是,Java語言中的數(shù)組是支付協(xié)變的,什么意思呢?看下面的代碼: static class A extends Base{ void f(...

    sunny5541 評論0 收藏0
  • 聊聊Java泛型及實現(xiàn)

    摘要:靜態(tài)變量是被泛型類的所有實例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關系取決于泛型類自身的繼承體系結構。事實上,泛型類擴展都不合法。 前言 和C++以模板來實現(xiàn)靜多態(tài)不同,Java基于運行時支持選擇了泛型,兩者的實現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...

    lewif 評論0 收藏0

發(fā)表評論

0條評論

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