T extends String許可されているのに警告が表示されるのはなぜですか?
型パラメーター T は、最終的な型 String によって制限されるべきではありません。最終的な型をさらに拡張することはできません
public class Car<T extends String>
I Know what is final I know の可能な値だけなので有効ですT can be StringWarning について疑問に思っていました。
T extends String許可されているのに警告が表示されるのはなぜですか?
型パラメーター T は、最終的な型 String によって制限されるべきではありません。最終的な型をさらに拡張することはできません
public class Car<T extends String>
I Know what is final I know の可能な値だけなので有効ですT can be StringWarning について疑問に思っていました。
実際の質問が「なぜ許可されているのか」である場合は、final既存のクラスにキーワードを追加する状況を想像してください。この変更によって、このクラスをジェネリック バウンドとして使用する他の既存のコードが壊れてしまうことは望ましくないと思います。これはまだ完全に合法であるためです。そのため、この場合、コンパイラはエラーを出力しません。
反対に、間違っfinalてジェネリック バウンドとしてクラスを使用した場合は、そのような構成が意味をなさないため、通知を受ける必要があります。そのため、コンパイラは警告を発します。
実際には、正当ではあるが無意味な構造を警告でマークするのが一般的な方法です。
基本的に、可能なタイプは 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の特殊なケースのコードを生成するのは厄介です。finalJava では final であるためString、つまり、そのクラスを拡張することはできません。String を拡張するクラスが存在できないため、警告が表示されます。