2012-09-18 29 views
6

可能重複:
@SuppressWarnings for 「extends String」爲什麼`T擴展字符串`是允許的,但會給出警告?

爲什麼T extends String被允許,但給警告?

類型參數T不應受最終類型String限制。最終類型不能被進一步延長

public class Car<T extends String> 

我知道什麼是最終的,我知道這是有效的,因爲的T can be String唯一可能的價值我想知道的警告。

+2

警告消息說明了一切。你怎麼能想出一個擴展'final'字符串的類?所以'T'將被定義爲'String' – Raffaele

+0

@ Thor84no查看編輯的問題和[axtavt](http://stackoverflow.com/a/12475147/315306)的回答 – Raffaele

回答

13

如果實際問題是「爲什麼允許」,那麼想象一下當您將final關鍵字添加到現有類時的情況。我認爲你不希望這種改變破壞其他使用這個類作爲通用邊界的現有代碼,因爲它仍然是完全合法的。這就是爲什麼編譯器在這種情況下不會發出錯誤的原因。

從另一方面來說,如果您偶然使用final類作爲通用邊界,您希望得到通知,因爲這樣的結構沒有意義。這就是編譯器發出警告的原因。

實際上,標記合法而無意義的結構與警告是一種常見的做法。

1

因爲在java中String是最終的,我。即你不能擴展這個類。 所以你有警告,因爲不能存在擴展字符串的類。

+2

OP詢問爲什麼它被允許執行? –

3

基本上說,T只有一個可能的類型,那就是String本身。所以基本上你的通用Car類是通用名稱。你也可以用String替換該類中的所有實例T

也許你的意思是...... public class Car<T extends CharSequence>


的結構可以使用,因爲類是有意義的,甚至可能是有益的。給出的警告是因爲(編譯器的作者認爲)你可能犯了一個錯誤。其理由是一樣的,一些編譯器會給你以下警告:

String NULL = null; 
System.err.println(NULL.toString()); 

這是有意義的,但它是一個錯誤...除非你打算拋出異常。


我能想到的兩種方案,其中public class Car<T extends SomeFinalClass>並沒有錯:

  • 其中SomeFinalClass原本不final的情況。
  • 自動生成代碼爲Car的情況,並且爲final類生成特殊情況代碼將會很尷尬。
相關問題