簡體   English   中英

為什么編譯器會這樣表現?

[英]Why does compiler behave like this?

看,我們有代碼:

public class Test2 {
    public static void main(String... args) {
        ArrayList<Exception> a = new ArrayListFactory().create(new RuntimeException());
        ArrayList<Exception> b = new ArrayListFactory().create("Z");
        }
}

class ArrayListFactory {
    public <T> ArrayList<T> create(T example) {
        return new ArrayList<T>(10);
    }
}

以及第二條語句的編譯錯誤:

Error:(15, 63) java: incompatible types: inference variable T has incompatible bounds
    equality constraints: java.lang.Exception
    lower bounds: java.lang.String
  1. 實際上,第一條語句將另一個ArrayList<RuntimeException>分配給ArrayList<Exception> ArrayList<RuntimeException> ,它是否與Java規則沖突?
  2. 第二條語句推斷create Exception類型參數。 它是否檢查方法的返回類型是否與ArrayListFactory類中定義的參數類型相匹配? 看來應該動態地解決此方法調用,為什么編譯器確定它正在處理正確的方法?

所有泛型類型都將在編譯時進行分配,因此編譯器將從您的分配及其預期的類型中推斷出類型,但在您的情況下,它們是不同的,因此它將產生類型不匹配錯誤,請更改此類代碼以修復錯誤。

public class Test2 {

    public static void main(String... args) {
        ArrayList<RuntimeException> a = new ArrayListFactory().create(new RuntimeException());
        ArrayList<String> b = new ArrayListFactory().create("Z");  
        }
}

在此語句中:

ArrayList<Exception> b = new ArrayListFactory().create("Z");

編譯器使用類型推斷(來自聲明ArrayList<Exception> )對create()的通用返回類型添加約束。 這稱為目標類型 表達式的目標類型是Java編譯器期望的數據類型,具體取決於表達式出現的位置。

在這種情況下,T應該是Exception的子類。 因此, RuntimeException很好。 String不是。

此功能隨Java 8一起出現。有關更多信息,請參見: http : //docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html

1)首次通話

    ArrayList<Exception> a = new ArrayList<RuntimeException>();

不是Java中泛型的合法使用。 您可以轉到“獲取原理”的說明進行理解。

2)二次通話

T類型的推論取決於從調用方聲明的返回類型。

在這里,調用者將返回的類型聲明為Exception

 ArrayList<Exception> b = new ArrayListFactory().create("Z");

而編譯錯誤:

錯誤:(15,63)java:不兼容類型:推斷變量T具有不兼容

邊界相等約束:java.lang.Exception

傳遞字符串:

 ArrayList<String> b = new ArrayListFactory().create("Z");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM