Java中是否存在类似“typeof”的函数,它返回原始数据类型(PDT)变量的类型或操作数PDT的表达式?
instanceof
似乎仅适用于班级类型。
答案 0 :(得分:59)
尝试以下方法:
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
答案 1 :(得分:18)
有一种简单的方法不需要隐式装箱,所以你不会在原语和它们的包装器之间混淆。您不能将isInstance
用于基本类型 - 例如调用Integer.TYPE.isInstance(5)
(Integer.TYPE
相当于int.class
)会返回false
,因为5
会自动退回到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 */
这依赖于编译器确定表达式类型并选择正确重载的能力。
答案 2 :(得分:1)
您可以使用以下课程。
class TypeResolver
{
public static String Long = "long";
public static String Int = "int";
public static String Float = "float";
public static String Double = "double";
public static String Char = "char";
public static String Boolean = "boolean";
public static String Short = "short";
public static String Byte = "byte";
public static void main(String[] args)
{
//all true
TypeResolver resolver = new TypeResolver();
System.out.println(resolver.getType(1) == TypeResolver.Int);
System.out.println(resolver.getType(1f) == TypeResolver.Float);
System.out.println(resolver.getType(1.0) == TypeResolver.Double);
System.out.println(resolver.getType('a') == TypeResolver.Char);
System.out.println(resolver.getType((short) 1) == TypeResolver.Short);
System.out.println(resolver.getType((long) 1000) == TypeResolver.Long);
System.out.println(resolver.getType(false) == TypeResolver.Boolean);
System.out.println(resolver.getType((byte) 2) == TypeResolver.Byte);
}
public String getType(int x)
{
return TypeResolver.Int;
}
public String getType(byte x)
{
return TypeResolver.Byte;
}
public String getType(float x)
{
return TypeResolver.Float;
}
public String getType(double x)
{
return TypeResolver.Double;
}
public String getType(boolean x)
{
return TypeResolver.Boolean;
}
public String getType(short x)
{
return TypeResolver.Short;
}
public String getType(long x)
{
return TypeResolver.Long;
}
public String getType(char x)
{
return TypeResolver.Char;
}
}