你怎么知道java中的变量类型? [复制]
Posted
技术标签:
【中文标题】你怎么知道java中的变量类型? [复制]【英文标题】:How do you know a variable type in java? [duplicate] 【发布时间】:2011-02-10 02:23:53 【问题描述】:假设我声明了一个变量:
String a = "test";
我想知道它是什么类型,即输出应该是java.lang.String
我该怎么做?
【问题讨论】:
你真的对变量的类型感兴趣吗?还是你关心值的类型?因为变量的类型不容易获取(实际上局部变量根本无法获取,需要对字段进行反射)。 @Paul:考虑Object o = "o";
——变量的类型是Object,值的类型是String。
@Paul 在List<String> l = new ArrayList<String>();
中,变量的类型是List<String>
,值的类型是ArrayList<String>
。
@Ben Lings 变量的类型是java.util.ArrayList,值的类型是java.util.ArrayList。
@AjayThakur - 这是编译时(静态)类型和运行时(动态)类型之间的区别。
【参考方案1】:
a.getClass().getName()
【讨论】:
这将给出值的类型。不一定是变量的类型。 我只是认为这是 OP 真正想要的,因为a
的声明在编译时非常明显
如果类型不是原始类型,那将起作用...如果类型是 int ,如何知道类型?
@Miguel:因为处理int
值的唯一方法是在int
变量中,所以没有办法编写处理int
值的代码并且没有t 知道那种类型。如果您正在处理Integer
之类的包装器,情况就不同了,但是这个答案的代码又可以工作了。
这不适用于原始类型。【参考方案2】:
我想在那里扩展马丁的答案...
他的解决方案相当不错,但可以对其进行调整,因此可以像这样打印任何“变量类型”。(实际上是值类型,more on the topic)。也就是说,“调整”可能是一个强有力的词。无论如何,它可能会有所帮助。
马丁解决方案:
a.getClass().getName()
但是,如果您希望它与任何东西一起工作,您可以这样做:
((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()
在这种情况下,原语将简单地包装在 Wrapper 中。在这种情况下,您将获得原语的 Object。
我自己是这样用的:
private static String nameOf(Object o)
return o.getClass().getSimpleName();
使用泛型:
public static <T> String nameOf(T o)
return o.getClass().getSimpleName();
【讨论】:
有趣。我刚刚尝试了您的代码: System.out.println( ( (Object) Integer.parseInt("12") ).getClass().getSimpleName() );它有效! \o/ 非常感谢,在getSimpleName()
之前,我尝试使用(Stack)(variable.getClass().toString().split(".")).pop()
但它不起作用,我使用javascript逻辑并将其类型转换为堆栈以弹出最后一个元素与.
分开,但没有用。【参考方案3】:
如果您想要名称,请使用 Martin 的方法。如果你想知道它是否是某个类的实例:
boolean b = a instanceof String
【讨论】:
你不是马丁吗? :) 另一个马丁 ... LOL ;) 粗码Double a = 1d; boolean b = a instanceof String;
会报错error: incompatible types: Double cannot be converted to String
【参考方案4】:
我从搜索引擎学到的(我的英语很糟糕,所以代码......) 如何获取变量的类型? 向上的:
String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String
这个方法:
str.getClass().getSimpleName();
value:String
现在的例子:
Object o = 1;
o.getClass().getSimpleName();
value:Integer
【讨论】:
【参考方案5】:使用java的运算符重载特性
class Test
void printType(String x)
System.out.print("String");
void printType(int x)
System.out.print("Int");
// same goes on with boolean,double,float,object ...
【讨论】:
Java没有运算符重载的概念,这就是方法重载【参考方案6】:我认为我们在这里有多种解决方案:
instance of 可能是一个解决方案。为什么? 在 Java 中,每个类都继承自 Object 类本身。所以如果你有一个变量并且你想知道它的类型。你可以使用
System.out.println(((Object)f).getClass().getName());或
Integer.class.isInstance(1985); // 给真或
isPrimitive()
public static void main(String[] args)
ClassDemo classOne = new ClassDemo();
Class classOneClass = classOne();
int i = 5;
Class iClass = int.class;
// checking for primitive type
boolean retval1 = classOneClass.isPrimitive();
System.out.println("classOneClass is primitive type? = " + retval1);
// checking for primitive type?
boolean retval2 = iClass.isPrimitive();
System.out.println("iClass is primitive type? = " + retval2);
这将给我们:
-
错误
是的
在此处了解更多信息: How to determine the primitive type of a primitive variable?
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html
【讨论】:
【参考方案7】:我同意 Joachim Sauer 所说的,不可能知道(变量类型!不是值类型!)除非您的变量是类属性(并且您必须检索类字段,按名称获取正确的字段.. .)
实际上对我来说,任何a.xxx().yyy()
方法都完全不可能为您提供正确的答案,因为根据您调用此方法的上下文,完全相同的对象上的答案会有所不同...
正如 teehoo 所说,如果您在编译时知道要测试的已定义类型列表,则可以使用 instanceof,但您也会得到返回 true 的子类...
一种可能的解决方案也是从java.lang.reflect.Field
的实现中激发自己的灵感,并创建自己的Field
类,然后将所有局部变量声明为这个自定义的Field
实现......但你最好找到另一个解决方案,我真的很想知道为什么你需要变量类型,而不仅仅是值类型?
【讨论】:
对于 "但是你也会得到子类返回 true...",我认为你的意思是 "但是你也会得到父类返回 true... “,对吧?以上是关于你怎么知道java中的变量类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章