如何知道Java中的变量类型?

假设我声明了一个变量:

String a = "test";

我想知道它是什么类型的,也就是说,输出应该是java.lang.String,我该怎么做呢?

480841 次浏览
a.getClass().getName()

如果你想要名字,就用马丁的方法。如果你想知道它是否是某个类的实例:

boolean b = a instanceof String

我同意Joachim Sauer所说的,不可能知道(变量类型!不是值类型!)除非你的变量是一个类属性(并且你必须检索类字段,通过名称获得正确的字段..)

实际上,对我来说,任何a.xxx().yyy()方法都完全不可能给你正确的答案,因为根据你调用这个方法的上下文,答案在完全相同的对象上是不同的……

正如Teehoo所说,如果你知道编译一个定义的类型列表来测试,你可以使用InstanceOf,但你也会得到返回true的子类。

一种可能的解决方案是从java.lang.reflect.Field的实现中激发自己的灵感,并创建自己的Field类,然后将所有局部变量声明为此自定义Field实现。但你最好找到另一种解决方案,我真的很想知道为什么你需要变量类型,而不仅仅是值类型?

我从搜索引擎中学习(我的英语很差,所以代码..) 如何获取变量的类型? 向上的:

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

这种方法:

str.getClass().getSimpleName();
value:String

现在举例:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

扩展马丁的回答……

马丁斯溶液

a.getClass().getName()

扩展解决方案

如果你想让它与任何东西一起工作,你可以这样做:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

在基本类型的情况下,它将被包装(自动装箱)在相应的对象变量中。

示例#1(常规)

private static String nameOf(Object o) {
return o.getClass().getSimpleName();
}

示例#2(泛型)

public static <T> String nameOf(T o) {
return o.getClass().getSimpleName();
}

额外的学习

使用Java的运算符重载功能

class Test {


void printType(String x) {
System.out.print("String");
}


void printType(int x) {
System.out.print("Int");
}


// same goes on with boolean,double,float,object ...


}

我认为我们有多种解决方案:

  • 的实例可能是一个解决方案。

-为什么? 在Java中,每个类都继承自Object类本身。如果你有一个变量,你想知道它的类型。你可以用

  • System.out.println(((object)f).getClass().getName());

  • Integer.Class.IsInstance(1985);//给出true

  • IsPrimitive()

    public static void main(String[] args) {
    
    
    ClassDemo classOne = new ClassDemo();
    Class classOneClass = classOne();
    
    
    int i = 5;
    Class iClass = int.class;
    
    
    // checking for primitive type
    boolean retval1 = classOneClass.isPrimitive();
    System.out.println("classOneClass is primitive type? = " + retval1);
    
    
    // checking for primitive type?
    boolean retval2 = iClass.isPrimitive();
    System.out.println("iClass is primitive type? = " + retval2);
    }
    

This going to give us:

  1. FALSE
  2. TRUE

Find out more here: How to determine the primitive type of a primitive variable?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html