检测未初始化对象的类型

时间:2015-12-16 13:31:03

标签: java class types detect

假设我有一个未初始化的对象,例如:

MyClass A=null;

如何检测A的类型是MyClass? A instanceof MyClass.class无效。它返回假。并且A.getClass()会抛出NullPointerException。有没有办法找到这种未初始化对象的类型?

编辑:

实际情况是MyClassAMyClassBMyClassCMyClass的子类。所以我正在使用以下代码:

MyClassB B=null;
MyClass MC=B;

现在,在运行时,我需要确定MC是否是""的实例。 MyClassAMyClassBMyClassC。有没有办法做到这一点?

编辑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对象,则无法使用。

2 个答案:

答案 0 :(得分:5)

您知道该变量的静态(编译时)类型 - 它是MyClass。您不需要instanceofA.getClass

当您需要知道变量引用的实例的运行时间时,

instanceofA.getClass非常有用。当变量包含null时,这没有意义。

编辑:

如果MC为空,则它不是任何实例。如果你写

,没有区别
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的实例。

答案 1 :(得分:0)

instanceof运算符允许您确定对象的类型。我们这里有一个引用而不是一个对象,如果我们A = new MyClass();那么它将创建一个新的对象,并将由A引用。

因为,没有A引用的对象,不会有任何对象类型。但是,我们可以在这里知道引用类型,即MyClass。

此外,instanceof是一个空安全运算符。含义,null instanceof AnyClass将始终返回false。