[英]Java Generic type inference derived from method return type
public class TestCase {
public static String compiles() {
return getAction();
}
/*
public static String doesntCompile1() {
return (String) getAction();
}
public static String doesntCompile2() {
return TestCase.<String> getAction();
}
*/
public static <T extends javax.swing.Action> T getAction() {
return (T) null;
}
}
這應該被視為javac v1.6.0_22和jdt v3.7.1中的錯誤嗎? 對我來說似乎是這樣,因為在其他情況下,編譯器實際上發現了潛在的ClassCastException。 在compiles方法中,這將在運行時拋出ClassCastException。
帶來這個例子的原始代碼沒有在javac中編譯,打印出以下異常。 不幸的是,我出於某種原因提供的例程代碼不會產生此錯誤。
type parameters of <T>T cannot be determined;
no unique maximal instance exists for type variable T with upper bounds
我希望一個好的編譯器能夠檢測到錯誤,但作為一種優化。 您提出了一個更一般的案例的具體案例,如下所示:
public class TestCase {
public static TypeA methodA() {
return methodB();
}
public static <T extends TypeB> T methodB() {
return (T) null;
}
}
現在,總的來說沒有任何問題,只要:
現在,編譯器沒有檢查的關鍵是#2,在這種情況下它可以。 但那只是因為String
是最后一堂課。 如果該類不是final,則#2將始終為true,因為在編譯時不知道潛在的子類。
想象一下,你使用CharSequence
而不是String
。 然后我希望這三個人都能編譯。 但是,我無法解釋為什么在您的示例中第二個和第三個方法不能編譯。
現在我用javac
嘗試過,發現第一種方法也沒有編譯。 以上接受了你的問題的前提似乎是錯誤的。 我得到了誤導性的編譯錯誤
不兼容的類型。 必需:
java.lang.String
。 發現:T
。
這個答案沒有回答完整的問題,而是解釋了為什么它不起作用,但是這樣的事情:
public static CharSequence compiles() {
return (CharSequence)getAction();
}
確實。
我不明白這里的問題是什么。 你得到的錯誤既明顯又預期。
對於doesntCompile1
方法,我的編譯器告訴我
無法從Action轉換為String
這是完全期望的 - 我們知道該方法返回一個T
,這是一個Action
,我們知道Action
不能轉換為String
。
對於doesntCompile2
方法,我的編譯器告訴我
綁定不匹配:類型TestCase的泛型方法getAction()不適用於arguments()。 推斷類型String不是有界參數的有效替代
這與上述基本相同
你期望它做什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.