web-dev-qa-db-ja.com

プリミティブ変数のプリミティブ型を決定する方法は?

Javaにプリミティブ型データ型(PDT)変数の型またはオペランドPDTの式を返す関数のような "typeof"がありますか?

instanceofはクラス型でのみ機能するようです。

40
ashley

以下を試してください:

int i = 20;
float f = 20.2f;
System.out.println(((Object)i).getClass().getName());
System.out.println(((Object)f).getClass().getName());

印刷されます:

Java.lang.Integer
Java.lang.Float

instanceofについては、その動的な同等物 Class#isInstance

Integer.class.isInstance(20);  // true
Integer.class.isInstance(20f); // false
Integer.class.isInstance("s"); // false
65
João Silva

暗黙のボクシングを必要としない簡単な方法があるので、プリミティブとそのラッパーの間で混乱することはありません。プリミティブ型にisInstanceを使用することはできません。 Integer.TYPE.isInstance(5)(_Integer.TYPE_は_int.class_と同等です)は、_5_が事前にfalseに自動ボックス化されるため、Integerを返します。

必要なものを取得する最も簡単な方法(注-プリミティブのコンパイル時には技術的に行われますが、それでも引数の評価が必要です)はオーバーロードによるものです。 ideone paste を参照してください。

_...

public static Class<Integer> typeof(final int expr) {
  return Integer.TYPE;
}

public static Class<Long> typeof(final long expr) {
  return Long.TYPE;
}

...
_

これは、たとえば次のように使用できます。

_System.out.println(typeof(500 * 3 - 2)); /* int */
System.out.println(typeof(50 % 3L)); /* long */
_

これは、式のタイプを判別して適切なオーバーロードを選択するコンパイラーの能力に依存しています。

18
oldrinb