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

use*_*460 0 java variables class instanceof

注意:我不是在询问可以使用哪些类型来存储类名,也不是要求使用解决方法来存储类名,例如反射或使用Strings.这也不是询问如何使用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{}
Run Code Online (Sandbox Code Playgroud)

我知道上面的代码会失败.但我很好奇是否可以存储一个类,以便它可以像我正在键入类名本身一样工作.

System.out.println(a instanceof A);    //This will work
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(a instanceof xx);   
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否可以存储A一个变量,以便编译器将该变量看作是看到它A

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

Bak*_*riu 5

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

语法规定语法为instanceof:

RelationalExpression:
    RelationalExpression instanceof ReferenceType
Run Code Online (Sandbox Code Playgroud)

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

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

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

System.out.println(c1.isInstance(a));
Run Code Online (Sandbox Code Playgroud)

文档明确地说:

确定指定的Object是否与此Class表示的对象分配兼容.此方法是Java语言instanceof运算符的动态等效项.