假设我有一个未初始化的对象,例如:
MyClass A=null;
如何检测A的类型是MyClass?A instanceof MyClass.class
不管用.这是假的.然后A.getClass()
抛出一个NullPointerException
.有没有办法找到这种未初始化对象的类型?
编辑:
实际情况是MyClassA
,MyClassB
并且MyClassC
是子类MyClass
.所以我将使用以下代码:
MyClassB B=null; MyClass MC=B;
现在,在运行时,我需要确定MC是"实例" MyClassA
还是MyClassB
或MyClassC
.有没有办法做到这一点?
编辑2:
通过在运行时检测类型,我将能够执行以下操作:
MyClass C=null; ... //detect the type of C and instantiate the base class with an instance of that type MyClass MC=new MyClassC();
基本上,我将传递所有子类的对象,我将必须确定每个对象的类型,并使用该类型实例化基类并返回它.
编辑3:
终于找到了部分方法来做到这一点!依靠多态来做到这一点:
MyClassC C=null; detect(C); .... detect(MyClassA a){} detect(MyClassB b){} detect(MyClassC c){ //MyClassC detected! }
但是,如果我传递了MyClass
对象,这将无效.
你知道那个变量的静态(编译时)类型 - 它是MyClass
.你不需要instanceof
或A.getClass
.
instanceof
或者A.getClass
在需要知道变量引用的实例的运行时间时非常有用.当变量包含时,这没有意义null
.
编辑:
如果MC
为null,则它不是任何实例.如果你写的话没有区别
MyClassB B=null; MyClass MC=B;
要么
MyClassC C=null; MyClass MC=C;
要么
MyClass MC=null;
在所有这些情况下,MC
它将包含相同的null
值,并且除了其编译时类型之外,它将不具有任何类型MyClass
.
编辑2:
分配给MC时,可以实例化正确的类:
MyClassC C = null; MyClass MC = C==null?new MyClassC():C;
在您分配C
时MC
,您知道其类型,C
并且您可以创建一个MyClassC
if为null 的实例.