下面哪个比较好?
a instanceof B
or
B.class.isAssignableFrom(a.getClass())
我所知道的唯一区别是,当'a'为空时,第一个返回false,而第二个抛出异常。除此之外,它们总是给出相同的结果吗?
下面哪个比较好?
a instanceof B
or
B.class.isAssignableFrom(a.getClass())
我所知道的唯一区别是,当'a'为空时,第一个返回false,而第二个抛出异常。除此之外,它们总是给出相同的结果吗?
当前回答
这个帖子让我了解了instanceof与isAssignableFrom的不同之处,所以我想分享一下我自己的一些内容。
我发现使用isAssignableFrom是唯一的(可能不是唯一的,但可能是最简单的)方法来询问自己一个类的引用是否可以接受另一个类的实例,当一个类的实例都没有时进行比较。
因此,当我只有类时,我不认为使用instanceof操作符比较可赋值性是一个好主意,除非我打算从其中一个类创建一个实例;我觉得这样会很草率。
其他回答
考虑以下情况。假设你想检查类型A是否是obj类型的超类,你也可以这样做
... A.class.isAssignableFrom(obj.getClass()) ...
OR
... A . obj instanceof ...
但是isAssignableFrom解决方案要求obj的类型在这里是可见的。如果不是这样(例如,obj的类型可能是一个私有内部类),则该选项无效。然而,instanceof solution总是可以工作的。
Instanceof只能用于引用类型,不能用于基本类型。isAssignableFrom()可以用于任何类对象:
a instanceof int // syntax error
3 instanceof Foo // syntax error
int.class.isAssignableFrom(int.class) // true
看到http://java.sun.com/javase/6/docs/api/java/lang/Class.html isAssignableFrom (. lang . class)。
Instanceof也不能用于基本类型或泛型类型。如下代码所示:
//Define Class< T > type ...
Object e = new Object();
if(e instanceof T) {
// Do something.
}
错误是:不能对类型参数t执行instanceof检查,而是使用它的erasure对象,因为进一步的泛型类型信息将在运行时被擦除。
由于删除运行时引用的类型擦除而无法编译。然而,下面的代码将编译:
if( type.isAssignableFrom(e.getClass())){
// Do something.
}
更直接的等价于B的实例是
B.class.isInstance(a)
当a为空时,这也可以工作(返回false)。
这个帖子让我了解了instanceof与isAssignableFrom的不同之处,所以我想分享一下我自己的一些内容。
我发现使用isAssignableFrom是唯一的(可能不是唯一的,但可能是最简单的)方法来询问自己一个类的引用是否可以接受另一个类的实例,当一个类的实例都没有时进行比较。
因此,当我只有类时,我不认为使用instanceof操作符比较可赋值性是一个好主意,除非我打算从其中一个类创建一个实例;我觉得这样会很草率。