簡體   English   中英

Java 泛型,返回 T 的方法,其中<T extends String>不能返回字符串

[英]Java generic, method that returns T where <T extends String> cannot return string

我發現以下代碼:

public class Ex7 {
    static class Translator<T1, T2 extends String> {
        T2 translate(T1 what) {
           return what + " ";
        }
    }
    public static void main(String[] args) {
        System.out.println(
            new Translator<Integer, String>().translate(1)
       );
    }
}

我不明白為什么這段代碼不能編譯,因為 T2 是字符串,我想返回
來自方法“翻譯”的字符串,編譯器說它需要 T2 而不是字符串,但我知道 T2 是字符串,正如此處所述:

new Translator<Integer, String>().translate(1)

有人可以向我解釋一下嗎?

T2 extends String是合法的,但毫無意義。 沒有任何擴展String ,因為它是一個最終類。 但是,編譯器不會阻止您編寫此代碼,因為它不考慮邊界類的final

String放在一邊,考慮一下這些類:

class A {}
class B extends A {}

如果你聲明一個這樣的類:

static class Translator<T1, T2 extends A> {
    T2 translate(T1 what) {
       return new A();
    }
}

你可以希望看到為什么這會是非法的:

Translator<String, B> t = new Translator<>();
B result = t.translate("");

這里, resultB一個實例; 但是該方法的實現意味着它返回一個A 這肯定會失敗,因此被禁止。

在這方面,編譯器認為StringA沒有任何不同:可能有一個子類,因此它禁止您在可能期望返回子類的地方返回String

因為 T2 是字符串

這是必不可少的部分。 泛型類是可以使用各種類型的實例的模板。 如果方法簽名定義了T2 ,即使它有一個像extends String這樣的約束,它仍然是通用的。 T2永遠不是String ,它是某種應該擴展String未知類型。

如果泛型類不考慮這一點並返回String則它違反了返回T2的方法定義。

暫無
暫無

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

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