Java 3者演算子と<JDK8互換のif / else


Answers

これは、公式のJDK-8リリースのほぼ1年前の2013年5月3日にかなり古いコミットで導入されました。 コンパイラはそのような時代に大きく発展していたため、このような互換性の問題が発生する可能性があります。 SpringのチームがJDK-8のビルドをテストし、実際にコンパイラの問題であっても、問題を修正しようとしたと思います。 JDK-8の公式リリースにより、これは無関係になりました。 これで、このコードの3進演算子は期待どおりに正常に動作します(コンパイルされた.class-fileのExecutableクラスへの参照はありません)。

現在、JDK-9にも同様のものがあります。JDK-8でうまくコンパイルできるコードの一部は、JDK-9 javacで失敗します。 おそらく、そのような問題のほとんどはリリースまで修正されるだろう。

Question

最近私はSpring Frameworkのソースコードを読んでいます。 私が理解できない何かがここに行く:

public Member getMember() {
    // NOTE: no ternary expression to retain JDK <8 compatibility even when using
    // the JDK 8 compiler (potentially selecting java.lang.reflect.Executable
    // as common type, with that new base class not available on older JDKs)
    if (this.method != null) {
        return this.method;
    }
    else {
        return this.constructor;
    }
}

このメソッドは、 org.springframework.core.MethodParameterクラスのメンバーです。 コメントは難しいが、コードは分かりやすい。

注意:JDK 8コンパイラを使用していてもJDK <8の互換性を保持する三項式はありません(古いタイプのJDKでは使用できない新しい基本クラスを持つ共通タイプとしてjava.lang.reflect.Executableを選択する可能性があります)

このコンテキストで三項表現を使用しif...else...構文を使用することの違いは何ですか?




三項式の戻り値の型は親クラスの影響を受けます。親クラスはJava 8で説明したように変更されました。

なぜキャストが書かれなかったのか分かりません。