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


Answers:


111

Java是一种静态类型的语言,因此编译器会为您执行大部分检查。一旦将变量声明为某种类型,编译器将确保仅为其分配该类型的值(或作为该类型的子类型的值)。

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

int x;

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

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

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

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

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


3
instanceof运算符仅确定变量引用的对象的数据类型。它不能确定最初请求的实际VARIABLE的数据类型。
格兰特·罗伯逊,

38

实际上,通过滥用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 );

21
IMO不是一个好方法。如果我传递了Typetester类中未定义的任意类型,例如,在这种情况下为String,会发生什么情况?
塔什·佩希瓦

6
@TashPemhiwa然后将String和Object添加到选择中。创造力和解决问题的能力是程序员的最佳资产。
加藤2014年

8
不过这只能有一组固定的预定义类的(这违背了面向对象/多态性的目的)处理,只会给你的东西,如“未知类”其他任何类的对象
Algoman

3
选择哪个签名发生在编译时,而不是运行时。因此,该技术不会告诉您在编译时不知道的任何内容。 docs.oracle.com/javase/specs/jls/se7/html/…– jmh 2015
6

26

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

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

我从以下信息中获取了信息: 您如何知道Java中的变量类型?

这可能发生。我正在尝试将a解析String为一个int,我想Integer.parseInt(s.substring(a, b))在总结之前先知道我是在踢int还是垃圾。

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



13

只需使用:

.getClass().getSimpleName();

例:

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

输出:

StringBuilder

1
我建议指出,如果randSB保持NULL ,则此方法无效。
罗勒·布尔克

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! ");
}

这样,您不必具有多个重载方法。我认为,由于增加了好处,因此最好在数组上使用集合。话虽如此,我不知道如何检查数组类型。也许有人可以改善此解决方案。希望这可以帮助!

PS是的,我知道这也不会检查原语。


6

问题的第一部分毫无意义。在任何情况下,您在编译时都不了解原始变量的类型。

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


5
我可以有一个从字符串到对象的哈希图,将一个int放入该哈希图中,然后将其拉回。我唯一知道的是它是一个“对象”,可能必须检查它是什么类型。不是说好,而是说有可能。
matty-d


2

我对这些答案都不满意,正确的答案没有解释,但票数不佳,因此我四处搜寻,查找并编辑了一些内容,以便于理解。试一试,不像人们希望的那样直接。

//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);

这是一个方法:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

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

从我发现的情况来看,只有使用极为丑陋的解决方法,或者将初始化参数传递给函数,使其就位,才有可能,请参见此处:

<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是一种变量),我认为应该将其包括在内


0

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

参考- 这是Oracle文档链接


0

基本上,例如:

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
    }

}

1
小提示:当有一个问题,那就是10岁了,已经> 10个回答其中的一些具有> 100个upvotes,那么它是(不是不可能的,但)非常非常不可能的,一个新的答案可以添加一些有用的东西(特别是,当这只是一个代码段,上面写着“在这里,看,这会打印出一些东西” ...)
Marco13

-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());

}

}

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.