3

コンパイラーによって Java SE 6 または 7 のアノテーション・プロセッサーでインスタンスを使用できるようにする必要があるユーティリティー・インターフェースTypesのドキュメントには、私が取り組んでいるコード・スニペットで興味深い 2 つのメソッドがあります。フィールドの型が特定の抽象クラスから継承された型であるかどうかを確認する必要があります。適用できると思われる 2 つの方法はisAssignable、 とisSubtypeです。しかし、これらのどれを使用するかはわかりません。

上記のドキュメントで参照されている Java 言語仕様の部分を確認しました。サブタイプと割り当て変換の概念の違いを理解しています (少なくとも私は理解していると思います)。私が間違っていない限りjava.lang.Short、プリミティブのサブタイプにはなりません (サブタイプはプリミティブlong間で定義されますが、クラスやプリミティブ間では定義されません)。

final Short s = 0;
final long l = s;

ただし、私の場合、どの方法を使用するのが最適かはまだわかりません。サブタイプのチェックは、割り当て可能性よりも厳密で好ましいように見えますが、クラスに関しては、一方が他方を自動的に暗示しているように感じます。

長いバージョンの短い:比較された TypeMirrors が両方ともクラス (インターフェイスまたは列挙型ではない) の場合、同等ですかisAssignable?isSubtype

4

1 に答える 1

1

参照の割り当てを行う場合、この場合に適用される唯一の変換は拡大参照変換です (もちろん恒等変換は除きます)。現在、それを実行するための次のルールがあります。

S が T のサブタイプ(§4.10) である場合、任意の型 S から任意の型 T への拡大参照変換が存在します。

これは、クラスのみを考慮する場合、サブタイプまたは代入可能性について話すかどうかは問題ではないことを意味します。はい、この場合、言及された方法は同等です。

于 2011-10-13T19:32:11.340 に答える