我如何检查以确保我的变量是int,array,double等......?
编辑:例如,如何检查变量是否为数组?有这样的功能吗?
答案 0 :(得分:89)
Java是一种静态类型语言,因此编译器会为您完成大部分检查。一旦将变量声明为某种类型,编译器就会确保只为该类型赋值(或者是该类型的子类型的值)。
您给出的示例(int,array,double)这些都是基元,并且没有它们的子类型。因此,如果您将变量声明为int
:
int x;
您可以确定它只会保留int
个值。
但是,如果您将变量声明为List
,则变量可能会保存List
的子类型。这些示例包括ArrayList
,LinkedList
等
如果您确实有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等。
答案 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());
}
}