Java isInstance vs instanceOf运算符

整个generics的东西有点像扔我一个循环,更多的RTT。

Specificis? 啊,这里是要点:

enum QueryHelper { query1, query2; static  QueryHelper getQueryHelper (Class expectedReturn) { if (expectedReturn.isInstance (SomeRelatedClass.class)) return query1; else return query2; } } 

然后我会这样称呼它:

 ... QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class); ... 

这样我就可以在实际的帮助器中灵活地分配查询返回类型。 它做了一些铸造和对象创建。 我所看到的是,没有比赛,我应该以其他方式做到这一点吗? 或者整个想法是不是很糟糕?

真正的核心是我不明白class.isInstance和instanceOf运算符之间的区别? 我应该使用后者吗?

这样我就可以在实际的帮助器中灵活地分配查询返回类型。

这种方法的返回类型没有任何灵活性

 static  QueryHelper getQueryHelper (Class expectedReturn) { if (expectedReturn.isInstance (SomeRelatedClass.class)) return query1; else return query2; } 

它将始终返回QueryHelper的实例。 如果您希望返回类型具有灵活性,则需要将其定义为:

 static  T getQueryHelper (Class expectedReturn) { } 

现在返回类型是灵活的,因为它将取决于参数的类型

真正的核心是我不明白class.isInstance和instanceOf运算符之间的区别?

不同之处在于instanceof执行在编译时修复的类型检查,例如:

 static boolean isInstance(Object myVar) { return (myVar instanceof Foo); } 

将始终检查myVar是否为Foo的实例,而

 static  boolean isInstance(Object myVar, Class expectedType) { return expectedType.isInstance(myVar); } 

将检查myVar是expectedType的实例,但每次调用该方法时,expectedType都可以是不同的类型

Class.isInstance()不像您的代码所期望的那样工作。 它测试传递给它的对象是否是该类的实例。 在你的代码中:

 expectedReturn.isInstance(SomeRelatedClass.class) 

您传递的对象是Class对象。 试试这个,返回true:

 Class.class.isInstance(SomeRelatedClass.class); 

您可能正在寻找的是Class.isAssignableFrom() ,例如:

 Object.class.isAssignableFrom(Class.class); 

意味着你可以这样做:

 Class klass = ...; Object o = klass; 

isInstance的预期参数是一个对象,它可以是类对象表示的类的实例。 你要比较它的是类的一个实例… java.lang.Class ! 所以它不会匹配。

例如,是真的:

 Class.class.isInstance(SomeRelatedClass.class); 

也是如此(没有关于以这种方式实际构建查询助手的理智的架构评论)

 expectedReturn.isInstance(new SomeRelatedClass());