25

整个泛型的事情有点让我陷入困境,RTT 更是如此。

特异性?嗯,这是要点:

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 运算符之间的区别?我应该使用后者吗?

4

3 回答 3

30

这样我就可以真正灵活地在实际助手中分配查询返回类型。

这个方法的返回类型没有什么灵活的

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 可以是不同的类型

于 2010-11-10T00:31:04.117 回答
3

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;
于 2010-11-10T00:26:49.150 回答
1

isInstance 的预期参数是一个对象,它可能是您的类对象所代表的类的实例。您将其与该类的实例进行比较... java.lang.Class!所以它不会匹配。

例如,将是真的:

Class.class.isInstance(SomeRelatedClass.class);

也是正确的(没有关于以这种方式实际构建查询助手的合理性的架构评论)

expectedReturn.isInstance(new SomeRelatedClass());
于 2010-11-10T00:26:47.507 回答