![](/img/trans.png)
[英]Generic issues: T extends interface type. Cannot call method to return an object which extends the type?
[英]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("");
這里, result
是B
一個實例; 但是該方法的實現意味着它返回一個A
。 這肯定會失敗,因此被禁止。
在這方面,編譯器認為String
與A
沒有任何不同:可能有一個子類,因此它禁止您在可能期望返回子類的地方返回String
。
因為 T2 是字符串
這是必不可少的部分。 泛型類是可以使用各種類型的實例的模板。 如果方法簽名定義了T2
,即使它有一個像extends String
這樣的約束,它仍然是通用的。 T2
永遠不是String
,它是某種應該擴展String
未知類型。
如果泛型類不考慮這一點並返回String
則它違反了返回T2
的方法定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.