web-dev-qa-db-ja.com

javacが不可能なキャストを許可し、他のキャストを許可しないのはなぜですか?

StringJava.util.Dateにキャストしようとすると、Javaコンパイラーがエラーをキャッチします。それで、コンパイラーが以下のエラーをフラグしないのはなぜですか?

List<String> strList = new ArrayList<>();                                                                      
Date d = (Date) strList;

もちろん、JVMは実行時にClassCastExceptionをスローしますが、コンパイラーはフラグを立てません。

動作は、javac 1.8.0_212および11.0.2と同じです。

53
Mike Woinoski

5.5.1。参照型のキャスト:

コンパイル時の参照型S(ソース)とコンパイル時の参照型T(ターゲット)が指定されている場合、以下の規則によりコンパイル時エラーが発生しない場合、キャスト変換はSからTに変換されます。

[...]

Sがインターフェース型の場合:

  • [...]

  • Tが最終でないクラスまたはインタフェースタイプの場合は、XのスーパータイプTが存在する場合、及びYのスーパータイプSXY両方が証明可能異なるパラメータ化された型であるように、及びXYの消去その同じ場合、コンパイル時エラーが発生します。

    それ以外の場合、キャストはコンパイル時に常に有効です(TSを実装していない場合でも、Tのサブクラスである可能性があります)。

List<String>Sで、DateTです。

2