注意:我不是在询问可以使用哪些类型来存储类名,也不是要求使用解决方法来存储类名,例如反射或使用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本身。
答案 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));