[英]Java isInstance vs instanceOf operator
整个泛型的东西有点像扔我一个循环,更多的RTT。
Specificis? 啊,这里的要点是:
enum QueryHelper {
query1,
query2;
static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
if (expectedReturn.isInstance (SomeRelatedClass.class))
return query1;
else
return query2;
}
}
然后我会这样称呼它:
...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...
这样我就可以在实际帮助器中灵活地分配查询返回类型。 它做了一些铸造和对象创建。 我所看到的是,没有比赛,我应该以其他方式这样做吗? 或者整个想法是不是很糟糕?
而真正的核心是我不理解class.isInstance和instanceOf运算符之间的区别? 我应该使用后者吗?
这样我就可以在实际帮助器中灵活地分配查询返回类型。
这种方法的返回类型没有任何灵活性
static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
if (expectedReturn.isInstance (SomeRelatedClass.class))
return query1;
else
return query2;
}
它将始终返回QueryHelper
的实例。 如果您希望返回类型具有灵活性,则需要将其定义为:
static <T> T getQueryHelper (Class<T> expectedReturn) {
}
现在返回类型是灵活的,因为它将取决于参数的类型
而真正的核心是我不理解class.isInstance和instanceOf运算符之间的区别?
不同之处在于instanceof执行在编译时修复的类型检查,例如:
static boolean isInstance(Object myVar) {
return (myVar instanceof Foo);
}
将始终检查myVar是否为Foo的实例,而
static <T> boolean isInstance(Object myVar, Class<T> 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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.