如何确定基元变量的基元类型?

2022-08-31 20:52:14

Java中是否有类似“typeof”的函数返回基元数据类型(PDT)变量的类型或操作数PT的表达式?

instanceof似乎仅适用于类类型。


答案 1

请尝试以下操作:

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

至于 ,您可以使用它的动态对应类#isInstanceinstanceof

Integer.class.isInstance(20);  // true
Integer.class.isInstance(20f); // false
Integer.class.isInstance("s"); // false

答案 2

有一种简单的方法不需要隐式装箱,因此您不会混淆基元及其包装器。你不能用于基元类型 - 例如,调用(等效于)将返回,就像自动装箱到一个之前一样。isInstanceInteger.TYPE.isInstance(5)Integer.TYPEint.classfalse5Integer

获得所需内容的最简单方法(注意 - 从技术上讲,它是在编译时为基元完成的,但它仍然需要评估参数)是通过重载。看我的ideone糊状物

...

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 */

这取决于编译器确定表达式类型和选取正确重载的能力。