存储其他数据类型的数据类型是什么?

时间:2015-01-18 13:22:10

标签: java class variables instanceof

注意:我不是在询问可以使用哪些类型来存储类名,也不是要求使用解决方法来存储类名,例如反射或使用String。这也不是询问如何使用instanceof运算符的问题。

考虑这个例子:

A a = new A();
Class c1 = A.class;
System.out.println(a instanceof c1);    //Does not Work

Class c2 = A.class.getClass();
System.out.println(a instanceof c2);    //Does not Work

class A{}

我知道上面的代码会失败。但我很好奇是否可以存储一个类,以便它可以像我自己输入类名一样工作。

System.out.println(a instanceof A);    //This will work

我们可以保留(类)A一些变量xx,以便这样做吗?

System.out.println(a instanceof xx);   

我的问题是:是否可以使用变量存储A,以便编译器将该变量视为看到A

注意:我不是在问如何存储A的对象。我在问是否可以存储A本身。

2 个答案:

答案 0 :(得分:5)

您无法使用instanceof运算符。 instanceof 的第二个操作数必须是类名,它不能是任意表达式,特别是它不能是变量。

语法指出instanceof的语法是:

RelationalExpression:
    RelationalExpression instanceof ReferenceType

ReferenceType只能是类或接口的名称,数组类型或类型变量(不是正常变量)。因此,由于(当前)语法的基本限制,您使用哪种类型来声明您无法实现您想要的变量并不重要。

同样instanceof必须在编译时执行一些检查,因此,它必须能够确定在编译时要将哪种类型用作第二个操作数时间,但使用表达式将允许在运行时动态更改该类型。

但是,您可以使用动态等效项isInstance方法:

System.out.println(c1.isInstance(a));

文档明确表示如此:

  

确定指定的Object是否与赋值兼容   此类所代表的对象。 此方法是动态的   相当于Java语言instanceof运算符。

答案 1 :(得分:1)

将此用于一般情况:

System.out.println(c1.isAssignableFrom(a.getClass()));

或者对于实例:

System.out.println(c1.isInstance(a));