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

Str*_*rry 107 java

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

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

pka*_*ing 97

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

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

int x;
Run Code Online (Sandbox Code Playgroud)

你可以肯定它只会持有double价值.

int但是,如果将变量声明为a ,则变量可能包含子类型int.这些的实例包括List,List

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

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}
Run Code Online (Sandbox Code Playgroud)

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

  • instanceof 运算符仅确定变量引用的对象的数据类型。它不会按照最初的要求确定实际 VARIABLE 的数据类型。 (3认同)

小智 36

实际上很容易通过滥用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

Typetester t = new Typetester();
t.printType( yourVariable );
Run Code Online (Sandbox Code Playgroud)

  • IMO不是一个好方法.如果我传递一些未在Typetester类中定义的任意类型会发生什么 - 例如在此实例中是String? (18认同)
  • 这仍然只能处理一组固定的预定义类(它违背了面向对象/多态的目的),并且只会为任何其他类的对象提供类似"未知类"的东西 (7认同)
  • 然后@TashPemhiwa将String和Object添加到选项中.创造力和解决问题是程序员最好的资产. (6认同)
  • 选择哪个签名发生在编译时,而不是运行时。因此,该技术不会告诉您在编译时不知道的任何内容。https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2 (2认同)

Gle*_*rce 21

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

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

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

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

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


Ale*_*rov 13

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

  • 我们所需要的只是一个有效的用例. (2认同)

小智 10

只需使用:

.getClass().getSimpleName();
Run Code Online (Sandbox Code Playgroud)

例:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());
Run Code Online (Sandbox Code Playgroud)

输出:

StringBuilder
Run Code Online (Sandbox Code Playgroud)

  • 我建议注意,如果 `randSB` 为 NULL,这将不起作用。 (2认同)

小智 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! ");
}
Run Code Online (Sandbox Code Playgroud)

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

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


use*_*421 6

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

在第二部分中,唯一没有知道变量是否是数组的情况是它是否是一个Object.在哪种情况下object.getClass().isArray()会告诉你.

  • 我可以从一个字符串到另一个对象的hashmap,在该hashmap中放入一个int,然后将其拉出来.我唯一知道的是它是一个"对象",可能需要检查它是什么类型.不是说它很好,只是说这是可能的. (5认同)

小智 5

我用它做了: if(x.getClass() == MyClass.class){...}