2012-08-01 74 views
2

是否有可用于instanceof运算符的有效类类型变量?例如:Java instanceof运算符

String s = "abc"; 

Class<?> classType = String.class; 

if (s instanceof classType) { 
    //do something 
} 

来替代这样的:

if (s.getClass() == classType) { 
    //do something 
} 

会不会有任何性能优势?

回答

13

你在做什么并不相同。考虑子类会发生什么(我知道你不能继承String,所以在String的情况下它并不重要)。

class A {} 
class B extends A {} 

B b = new B(); 
b instanceof A // true 
b.getClass() == A.class // false 

如果你有一个对象,你想知道这是否是一个instanceof某种类型的,你有Class对象,你可以使用Class#isInstance方法。

在这两种情况下,我预计绩效差异是微不足道的。

+0

so X.class.isInstance(objectX)比做objectX instanceof X更快吗? – fernandohur 2013-01-17 04:24:30

+0

他们是不同的。如果您有类类型,则使用第一个,因为您无法执行objectX instanceof xClass。它有助于动态检查你正在检查的类在编译时是否未知。 – 2013-01-17 04:32:20

+0

我不确定我是否清楚,可以这样说:java.lang.String.cass.isInstance(objectX)与objectX instanceof java.lang.String比较。你会说哪个更快? – fernandohur 2013-01-17 04:35:29

3

还有

Class<?> classType = String.class; 

if (classType.isInstance(s)) {... 

至于性能,我期望任何这些之间的差异可以忽略不计。