如何检查Java中的变量类型?

时间:2010-10-22 04:51:19

标签: java

我如何检查以确保我的变量是int,array,double等......?

编辑:例如,如何检查变量是否为数组?有这样的功能吗?

15 个答案:

答案 0 :(得分:89)

Java是一种静态类型语言,因此编译器会为您完成大部分检查。一旦将变量声明为某种类型,编译器就会确保只为该类型赋值(或者是该类型的子类型的值)。

您给出的示例(int,array,double)这些都是基元,并且没有它们的子类型。因此,如果您将变量声明为int

int x;

您可以确定它只会保留int个值。

但是,如果您将变量声明为List,则变量可能会保存List的子类型。这些示例包括ArrayListLinkedList

如果您确实有List变量,并且需要知道它是ArrayList,则可以执行以下操作:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

但是,如果您发现自己认为需要这样做,则可能需要重新考虑自己的方法。在大多数情况下,如果您遵循面向对象的主体,则不需要执行此操作。当然,每条规则都有例外情况。

答案 1 :(得分:33)

通过滥用Java的方法过载能力,实际上很容易推出自己的测试人员。虽然我对sdk中有官方方法仍感到好奇。

示例:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

然后:

Typetester t = new Typetester();
t.printType( yourVariable );

答案 2 :(得分:20)

a.getClass().getName() - 将为您提供a引用的实际对象的数据类型,但不会提供变量a最初声明或随后转换为的数据类型。

boolean b = a instanceof String - 将告诉您a引用的实际对象是否是特定类的实例。 同样,变量a最初被声明为或随后被转换为的数据类型与instanceof运算符的结果无关。

我从以下信息中获取了这些信息: How do you know a variable type in java?

这可能发生。我试图将String解析成一个int,我想知道我的Integer.parseInt(s.substring(a, b))在尝试总结之前是否正在踢出一个int或者垃圾。

顺便说一下,这被称为反射。以下是有关此主题的更多信息:http://docs.oracle.com/javase/tutorial/reflect/

答案 3 :(得分:13)

您可以使用Integer而不是int,Double而不是double等(这些类适用于所有基本类型)。 然后您可以使用运算符instanceof,例如if(var instanceof Integer){...}

答案 4 :(得分:8)

嗯,我认为检查变量的类型可以通过这种方式完成。

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

这样您就不需要多个重载方法。我认为由于额外的好处,使用集合而不是阵列是一种好习惯。话虽如此,我不知道如何检查数组类型。也许有人可以改进这个解决方案希望这可以帮助!

P.S是的,我知道这也不会检查原语。

答案 5 :(得分:6)

你问题的第一部分毫无意义。在编译时,您不会知道原始变量的类型。

第二部分,唯一不知道变量是否是数组的情况是它是否是一个Object。在这种情况下,object.getClass().isArray()会告诉您。

答案 6 :(得分:6)

只需使用:

.getClass().getSimpleName();

示例:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

输出:

StringBuilder

答案 7 :(得分:5)

我是使用if(x.getClass() == MyClass.class){...}

完成的

答案 8 :(得分:2)

我对这些答案中的任何一个都不满意,正确的答案没有解释和反对票,所以我搜索了一下,找到了一些东西并编辑了它以便它易于理解。玩弄它,不像人们希望的那样直截了当。

$ apt-get install libmysqlclient-dev

这是一种方法:

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

答案 9 :(得分:2)

基本上,例如:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

答案 10 :(得分:0)

如果变量是未初始化的泛型类型,则这些答案均无效

据我所知,只有使用extremely ugly workaround或将初始化参数传递到函数中,使其就位的情况下,才有可能,请参见此处:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

无效,因为您不能直接从T参数中提取类型,因为它会在运行时删除。

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

之所以可行,是因为调用者负责在调用之前实例化变量out。如果在调用时out为null,这仍然会引发异常,但是与链接的解决方案相比,这是迄今为止最简单的方法

我知道这是一种特定的应用程序,但是由于这是google上第一个使用java查找变量类型的结果(并且鉴于T是一种变量),我觉得应该包括在内

答案 11 :(得分:0)

仅当变量具有非基本类型时,才可以使用Java.lang.Class.getSimpleName()方法轻松检查它。它不适用于基本类型int,long等。

参考-Here is the Oracle docs link

答案 12 :(得分:0)

我试图使用Generics进行类似的工作时遇到了这个问题。采取一些答案并添加getClass()。isArray(),我得到以下似乎可行的方法。

public class TypeTester <T extends Number>{

<T extends Object> String tester(T ToTest){

    if (ToTest instanceof Integer) return ("Integer");
    else if(ToTest instanceof Double) return ("Double");
    else if(ToTest instanceof Float) return ("Float");
    else if(ToTest instanceof String) return ("String");
    else if(ToTest.getClass().isArray()) return ("Array");
    else return ("Unsure");
}
}

我用它来调用它,其中myArray部分只是将一个数组放入callFunction.tester()进行测试。

public class Generics {
public static void main(String[] args) {
    int [] myArray = new int [10];

    TypeTester<Integer> callFunction = new TypeTester<Integer>();
    System.out.println(callFunction.tester(myArray));
}
}

您可以在最后一行将myArray换为10.2F,以测试Float等

答案 13 :(得分:0)

public static void chkType(Object var){     
        String type = var.getClass().toString();
        System.out.println(type.substring(16));     
        //assertEquals(type,"class java.lang.Boolean");
        //assertEquals(type,"class java.lang.Character");
        //assertEquals(type,"class java.lang.Integer");
        //assertEquals(type,"class java.lang.Double");      
    }

答案 14 :(得分:-4)

公共课Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}