4

誰かがこのコードの理由を説明できますか?

Collection c = (5 == 5) ? new ArrayList() : new HashSet();

次のコンパイラエラーが発生します。

互換性のない条件付きオペランドタイプArrayListおよびHashSet

私にはわからない理由で、以下は問題を修正します

Collection c = (5 == 5) ? (Collection) new ArrayList() : new HashSet();

私はJava1.4を使用しています。

4

2 に答える 2

7

これは1.4のバグであり、バグレポート 5080917に従って修正されました。

評価これはバグです。

xxxxx@xxxxx 2004-07-30

于 2010-07-05T17:46:50.333 に答える
3

ダニエルは多かれ少なかれこれを正しく理解していますが、彼の答えを削除しました(5票以上)。

第2版​​JLS(1.2-1.4)からの関連する引用

  • 2番目と3番目のオペランドが異なる参照型である場合、割り当て変換(§5.2)によって1つの型を他の型に変換できる必要があります(この後者の型をTと呼びます)。条件式の型はTです。どちらの型も他の型と割り当て互換性がない場合は、コンパイル時エラーになります。

タイプの1つは、他のタイプに変換可能である必要があります。これは、andには当てはまりませんが、and ArrayListandofandにHashSetは当てはまりCollectionます。HashSetArrayListCollection

第3版JLS(1.5+)

  • それ以外の場合、2番目と3番目のオペランドはそれぞれタイプS1とS2です。T1をS1にボクシング変換を適用した結果のタイプとし、T2をS2にボクシング変換を適用した結果のタイプとします。条件式のタイプは、キャプチャ変換(§5.1.10)をlub(T1、T2)(§15.12.2.7)に適用した結果です。

これは明らかなことを行いますが、それを指定して実装するのはより困難です(式の1つがあったときに、意図せずに初期バージョンのjavacがクラッシュしましたvoid)。IIRC、これはジェネリックの一部として行われた作業でした。

于 2010-07-05T20:07:05.490 に答える