[英]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
ArrayList<RuntimeException>
分配給ArrayList<Exception>
ArrayList<RuntimeException>
,它是否與Java規則沖突? 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.