簡體   English   中英

Java從方法返回類型派生的泛型類型推斷

[英]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;
    }
}

現在,總的來說沒有任何問題,只要:

  1. 如果TypeA和TypeB都是類,那么TypeB是TypeA的超類。
  2. TypeA 或TypeA的子類型之一繼承自TypeB。

現在,編譯器沒有檢查的關鍵是#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.

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