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


151

假设我声明了一个变量:

String a = "test";

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


1
您真的对变量类型感兴趣吗?还是您关心类型?因为不容易获得变量的类型(实际上,局部变量根本不可能,并且需要对字段进行反射)。
Joachim Sauer 2010年

8
@Paul:考虑Object o = "o";-变量的类型是Object,值的类型是String。
Michael Borgwardt

2
@Paul In List<String> l = new ArrayList<String>();,变量List<String>的类型为,值的类型为ArrayList<String>
Ben Lings 2010年

1
@Ben Lings变量的类型为java.util.ArrayList,值的类型为java.util.ArrayList。
Ajay Takur 2013年

1
@AjayThakur-它是编译时(静态)类型和运行时(动态)类型之间的差异。
Ben Lings 2013年

Answers:


269
a.getClass().getName()

16
这将给出值的类型。不一定是变量的类型。
Joachim Sauer

7
我只是觉得这是O​​P真正想要的,因为a在编译时很明显就声明了
Martin,2010年

4
如果类型不是基本类型,那将起作用...如果类型为int,如何知道类型?
Miguel Ribeiro '04

5
@Miguel:由于唯一可以处理int值的方法是在int变量中,因此无法编写处理int且不知道该类型的代码。如果您要处理类似的包装Integer,问题就不同了,但是此答案的代码再次起作用。
Joachim Sauer 2010年

1
对于原始类型,情况并非如此。
Mehdi

37

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

boolean b = a instanceof String


15
你也是马丁吗?:)
seokhoonlee

另一个马丁...大声笑;)
chankruze

Thic代码Double a = 1d; boolean b = a instanceof String;将导致错误error: incompatible types: Double cannot be converted to String
Alex78191

35

我想在此扩展马丁的答案...

他的解决方案相当不错,但是可以对其进行调整,以便可以像这样打印任何“变量类型”。(实际上是“值类型”,更多内容请参见主题)。也就是说,“调整”可能是一个有力的词。无论如何,这可能会有所帮助。

马丁斯解决方案:

a.getClass().getName()

但是,如果您希望它可以与任何东西一起使用,则可以执行以下操作:

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

在这种情况下,图元将简单地包装在包装器中。在这种情况下,您将获得图元的对象。

我自己这样使用它:

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

31

我从搜索引擎中学到了(我的英语很不好,所以代码...)如何获取变量的类型?UPS :

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

3

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

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

正如teehoo所说,如果您知道在编译定义的类型列表以进行测试时,可以使用instanceof,但是您还将获得返回true的子类。

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


对于“但是您还将使子类返回true ...”,我想您的意思是“但是您也将使父类返回true ...”,对吗?
Skomisa

3

使用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 ...

}

8
Java没有运算符重载的概念,这是方法重载
nicoschl

2

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

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

为什么?在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);
    }

这将给我们:

  1. 真正

点击这里了解更多: 如何确定原始类型原始变量?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.