6

重複の可能性:
@SuppressWarnings for “extends String”

T extends String許可されているのに警告が表示されるのはなぜですか?

型パラメーター T は、最終的な型 String によって制限されるべきではありません。最終的な型をさらに拡張することはできません

public class Car<T extends String> 

I Know what is final I know の可能な値だけなので有効ですT can be StringWarning について疑問に思っていました。

4

3 に答える 3

13

実際の質問が「なぜ許可されているのか」である場合は、final既存のクラスにキーワードを追加する状況を想像してください。この変更によって、このクラスをジェネリック バウンドとして使用する他の既存のコードが壊れてしまうことは望ましくないと思います。これはまだ完全に合法であるためです。そのため、この場合、コンパイラはエラーを出力しません。

反対に、間違っfinalてジェネリック バウンドとしてクラスを使用した場合は、そのような構成が意味をなさないため、通知を受ける必要があります。そのため、コンパイラは警告を発します。

実際には、正当ではあるが無意味な構造を警告でマークするのが一般的な方法です。

于 2012-09-18T10:28:40.757 に答える
3

基本的に、可能なタイプは 1 つだけでTあり、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
于 2012-09-18T10:28:30.960 に答える
3

Java では final であるためString、つまり、そのクラスを拡張することはできません。String を拡張するクラスが存在できないため、警告が表示されます。

于 2012-09-18T10:26:16.830 に答える