【问题标题】:How do you know a variable type in java? [duplicate]你怎么知道java中的变量类型? [复制]
【发布时间】:2011-02-10 02:23:53
【问题描述】:

假设我声明了一个变量:

String a = "test";

我想知道它是什么类型,即输出应该是java.lang.String我该怎么做?

【问题讨论】:

  • 你真的对变量的类型感兴趣吗?还是你关心值的类型?因为变量的类型不容易获取(实际上局部变量根本无法获取,需要对字段进行反射)。
  • @Paul:考虑Object o = "o";——变量的类型是Object,值的类型是String。
  • @Paul 在List<String> l = new ArrayList<String>();中,变量的类型是List<String>,值的类型是ArrayList<String>
  • @Ben Lings 变量的类型是java.util.ArrayList,值的类型是java.util.ArrayList。
  • @AjayThakur - 这是编译时(静态)类型和运行时(动态)类型之间的区别。

标签: java variables types


【解决方案1】:
a.getClass().getName()

【讨论】:

  • 这将给出值的类型。不一定是变量的类型。
  • 我只是认为这是 OP 真正想要的,因为 a 的声明在编译时非常明显
  • 如果类型不是原始类型,那将起作用...如果类型是 int ,如何知道类型?
  • @Miguel:因为处理int 值的唯一方法是在int 变量中,所以没有办法编写处理int 值的代码并且没有t 知道那种类型。如果您正在处理Integer 之类的包装器,情况就不同了,但是这个答案的代码又可以工作了。
  • 这不适用于原始类型。
【解决方案2】:

我想在那里扩展马丁的答案...

他的解决方案相当不错,但可以对其进行调整,因此可以像这样打印任何“变量类型”。(实际上是值类型,more on the topic)。也就是说,“调整”可能是一个强有力的词。无论如何,它可能会有所帮助。

马丁解决方案:

a.getClass().getName()

但是,如果您希望它与任何东西一起工作,您可以这样做:

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

在这种情况下,原语将简单地包装在 Wrapper 中。在这种情况下,您将获得原语的 Object。

我自己是这样用的:

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

使用泛型:

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

【讨论】:

  • 有趣。我刚刚尝试了您的代码: System.out.println( ( (Object) Integer.parseInt("12") ).getClass().getSimpleName() );它有效! \o/
  • 非常感谢,在getSimpleName()之前,我尝试使用(Stack)(variable.getClass().toString().split(".")).pop()但它不起作用,我使用JavaScript逻辑并将其类型转换为堆栈以弹出最后一个元素与. 分开,但没有用。
【解决方案3】:

如果您想要名称,请使用 Martin 的方法。如果你想知道它是否是某个类的实例:

boolean b = a instanceof String

【讨论】:

  • 你不是马丁吗? :)
  • 另一个马丁 ... LOL ;)
  • 粗码Double a = 1d; boolean b = a instanceof String;会报错error: incompatible types: Double cannot be converted to String
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    使用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没有运算符重载的概念,这就是方法重载
    【解决方案6】:

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

    • instance of 可能是一个解决方案。

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

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

    • Integer.class.isInstance(1985); // 给真

    • 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);
      }
      

    这将给我们:

    1. 错误
    2. 是的

    在此处了解更多信息: 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

    【讨论】:

      【解决方案7】:

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

      实际上对我来说,任何a.xxx().yyy() 方法都完全不可能为您提供正确的答案,因为根据您调用此方法的上下文,完全相同的对象上的答案会有所不同...

      正如 teehoo 所说,如果您在编译时知道要测试的已定义类型列表,则可以使用 instanceof,但您也会得到返回 true 的子类...

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

      【讨论】:

      • 对于 "但是你也会得到子类返回 true...",我认为你的意思是 "但是你也会得到父类返回 true... “,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多