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

如何检查以确保变量是 int、 array、 double 等等?

编辑: 例如,我如何检查一个变量是一个数组? 是否有一些函数可以做到这一点?

625008 次浏览

您可以使用 Integer 而不是 int、 Double 而不是 Double 等(这些类适用于所有基元类型)。 然后您可以使用操作符 instanceof,如 if(var instanceof Integer){...}

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

您给出的例子(int、 array、 double)都是原语,没有子类型。因此,如果将一个变量声明为 int:

int x;

您可以确定它将永远只保存 int值。

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

如果你有一个 List变量,你需要知道它是否是一个 ArrayList,你可以这样做:

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

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

你问题的第一部分毫无意义。在任何情况下,您都可以在编译时知道基元变量的类型。

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

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

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

boolean b = a instanceof String-将给出 a引用的实际对象是否是特定类的实例。 同样,变量 a最初声明为或随后强制转换为的数据类型与 instanceof 操作符的结果没有关系。

我得到的这些信息来自: 你怎么知道 Java 中的变量类型?

这是有可能的。我试图把一个 String解析成一个整型数,在我总结它之前,我想知道我的 Integer.parseInt(s.substring(a, b))是在踢出一个整型数还是垃圾数。

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

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

我认为检查变量的类型可以这样做。

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

这样,您就不需要有多个重载方法。由于附加的好处,我认为在数组上使用集合是一个很好的实践。尽管如此,我还是不知道如何检查数组类型。也许有人能改进这个解决方案。希望这个能帮上忙!

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

我对这些答案中的任何一个都不满意,正确的答案没有任何解释,也没有反对票,所以我搜索了一下,找到了一些东西,并进行了编辑,这样就容易理解了。好好利用一下,不要像人们希望的那样直截了当。

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

使用:

.getClass().getSimpleName();

例如:

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

产出:

StringBuilder

如果变量是未初始化的泛型类型,则这些答案都不起作用

据我所知,只有使用 极其丑陋的解决办法或者向函数传入一个初始化的参数,才能使函数就位,参见这里:

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

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

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

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

我知道这是一种特殊的应用程序,但是因为这是谷歌上第一个用 java 查找变量类型的结果(并且考虑到 T是一种变量) ,我觉得它应该被包括在内

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

参考资料 -这里是 Oracle 文档链接

基本上,例如:

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
}


}

我碰到这个问题,因为我试图得到类似的工作使用泛型。获取一些答案并添加 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 部分中,我使用这个函数调用它,只是为了将 Array 放入 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.2 F,以测试 Float 等

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");
}
var.getClass().getSimpleName()

举个例子

String[] anArrayOfStrings = { "Agra", "Mysore", "Chandigarh", "Bhopal" };
List<String> strList = Arrays.asList(anArrayOfStrings);


anArrayOfStrings.getClass().getSimpleName() //res =>  String[]
strList.getClass().getSimpleName() // res => ArrayList

我发现一个简单的解决方案是以下而不是想知道消防命令

public class DataTypeCheck
{


public static void main(String[] args)
{
String jobTitle = "Agent";
int employeeId = 7;
double floating= 10.0;
String bond = jobTitle + employeeId;


System.out.println(((Object)floating).getClass().getSimpleName());
System.out.println(((Object)employeeId).getClass().getSimpleName());
System.out.println(((Object)jobTitle).getClass().getSimpleName());
System.out.println(((Object)bond).getClass().getSimpleName());
}


}
Output:
Double
Integer
String
String