2012-09-18 2 views
6

可能性の重複:なぜT extends String
@SuppressWarnings for “extends String”`T extends String`はなぜ許可されているのですが警告を出すのですか?

を許可されますが、警告を与えますか?

タイプパラメータTは、最終的なタイプのStringによって制限されるべきではありません。最終的なタイプは、

public class Car<T extends String> 

さらに拡張することができない私はT can be Stringの唯一可能な値は、私は警告疑問を抱いたので、それが有効である知っている最後の何であるか知っています。

+2

警告メッセージにはすべてが記載されています。 'final' Stringを拡張したクラスをどうやって思いつくことができますか?だから 'T'は間違いなく' String'になるでしょう – Raffaele

+0

@ Thor84no編集された質問と、axtavt(http://stackoverflow.com/a/12475147/315306)の回答 – Raffaele

答えて

13

実際の質問が「なぜ許可されたのか」であれば、finalキーワードを既存のクラスに追加すると想像してください。私はあなたがこの変更が、このクラスをジェネリックバインドとして使う他の既存のコードを壊すことは望ましくないと思います。だからこそ、コンパイラはエラーを出さない。

finalクラスを汎用バインドとして誤って使用した場合は、そのような構成が意味をなさないため、通知を受けたいとします。だからこそコンパイラが警告を出すのです。

実際には、合法的だが意味のない構造に警告を付けるのが一般的です。

1

javaのStringは最終版です。 e。そのクラスを拡張することはできません。 Stringを拡張するクラスが存在しないため、警告が表示されます。

+2

OPがなぜ許可されているか質問しています? –

3

基本的には、Tの可能なタイプは1つだけで、それ自体はStringです。したがって、基本的には、汎用のCarクラスは名前にのみ一般的です。クラス内のTのすべてのインスタンスをStringに置き換えることもできます。

は、おそらくあなたは、クラスには意味のある、そして可能性も有用ですので


構築物が許可されている... public class Car<T extends CharSequence>意味します。この警告は、(コンパイラ作家の意見で)おそらく間違いを犯したために与えられます。

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

これは意味があるが、それは間違いです...あなたはそれが例外をスローするを意図していない限り:理由はいくつかのコンパイラは、次のためにあなたを与える警告の場合と同じです。


私はpublic class Car<T extends SomeFinalClass>は間違いないが、2つのシナリオを考えることができます:

  • SomeFinalClassはもともとfinalなかった場合。
  • Carのコードが自動的に生成され、finalクラスの特殊ケースコードを生成するのは厄介です。
関連する問題