obj
実行がその行に到達すると、それが のインスタンスであることがわかりますArrayTaskList
。ArrayTaskList<Integer>
ただし、それがorArrayTaskList<String>
などであるかどうかはわかりません。
したがって、キャストは警告を生成します ( to をキャストしようとすることができますArrayTaskList<Integer>
) ArrayTaskList<String>
。
ただし、ここでは型情報は必要ないため、ここでは使用ArrayTaskList<?>
する方が実際にはより良い解決策になります。
編集:
タイプの境界を使用しても警告が発生するため、ここで誤解がありました。@svz が指摘したように、ArrayTaskList<?>
仮定を追加せず、型チェックを有効にするだけです。
コンパイラは、へのキャストが問題ないことを信頼しますが、型もArrayTaskList
あると仮定しているため、警告が生成されます。コンパイラはそれをチェックできないため、警告が発行されます。またはを使用すると、コンパイラは型を無視しますが、失敗する可能性のあるメソッドが呼び出されるとエラーが発生します。obj
E
<?>
<? extends XYZ>
次の例を検討してください。
あなたのクラスは、したがって、またはArrayTaskList<E extends Number>
にキャストします(たとえば、どこにある可能性があります)。ArrayTaskList<Number>
ArrayTaskList<E>
E
Long
E
その場合、コンパイラは が などのタイプNumber
であるかどうかを認識しないLong
ため、警告が表示されます。これobj
は、ArrayTaskList<Double>
と をキャストするとArrayTaskList<Number>
、Long を Double (痛い) のリストに追加できるためです。
したがって、コンパイラはそのキャストについて警告します。
にキャストするArrayTaskList<?>
と、型を無視するようにコンパイラーに指示されますが、 を呼び出した場合はエラーが発生other.add(...)
し、偶発的な不一致を防ぐことができます。
編集2:
E
ここにはまだいくつかの誤解があります (これについては後で考えます) が、これまでのところ、警告なしでキャストし、提供される可能性のある上限を引き続き使用する方法を次に示します。
public boolean equals(Object obj) {
...
return equals_((ArrayTaskList<?>)obj);
}
protected boolean equals_(ArrayTaskList<? extends Number> other)
{
if (!Arrays.equals(db, other.db))
return false;
return true;
}