T extends String
許可されているのに警告が表示されるのはなぜですか?
型パラメーター T は、最終的な型 String によって制限されるべきではありません。最終的な型をさらに拡張することはできません
public class Car<T extends String>
I Know what is final I know の可能な値だけなので有効ですT can be String
Warning について疑問に思っていました。
T extends String
許可されているのに警告が表示されるのはなぜですか?
型パラメーター T は、最終的な型 String によって制限されるべきではありません。最終的な型をさらに拡張することはできません
public class Car<T extends String>
I Know what is final I know の可能な値だけなので有効ですT can be String
Warning について疑問に思っていました。
実際の質問が「なぜ許可されているのか」である場合は、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
の特殊なケースのコードを生成するのは厄介です。final
Java では final であるためString
、つまり、そのクラスを拡張することはできません。String を拡張するクラスが存在できないため、警告が表示されます。