你怎么知道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中的变量类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中怎么知道一个变量的类型

怎么使用java中的枚举方法

java中的引用类型和值类型

你知道为什么会划分数据类型吗?---JAVA数据类型与变量

如何通过JNI将java中的对象的地址赋值给c++指针变量

c#里MdiChild怎么访问MdiParent中的变量,执行其中的方法?this.MdiPare