当前位置: 首页 > 知识库问答 >
问题:

检查一个对象是否是一个类的实例(但不是它的子类的实例)

桑飞语
2023-03-14

对于此示例:

public class Foo{}

public class Bar extends Foo{}

....

void myMethod(Foo qux){
   if (checkInstance(qux,Foo.class)){
     ....
   }
}

如何检查 qux 是否是 Foo 的实例(但不是其 foo 子类的实例)?那是:

  • checkInstance(qux,Foo.class)=true
  • checkInstance(qux,Bar.class)=false

有没有类似于< code>instanceof的语句来进行这种检查?或者我应该使用< code>qux.getClass()。equals(Foo.class)

共有3个答案

韦安顺
2023-03-14

您应该使用instanceof

if(qux instanceof Foo && !(qux instanceof Bar)) {
    ...
}

这适用于类和接口,因此在大多数情况下,它应该优先于<code>。类</code>,它不与接口一起工作。

陶和歌
2023-03-14

如果您正在寻找精确的类匹配,唯一的方法qux.getClass().equals(Foo.class)。instanceof对于子类也将返回true。

周育
2023-03-14

如果必须这样做,唯一的方法就是< code>getClass()。equals(Foo.class)选项。

但是,OO设计的目标是允许您以相同的方式对待任何Foo。实例是否是子类在正常程序中应该是无关紧要的。

 类似资料:
  • 对于这个示例: null 是否有类似这样的语句用于此检查?或者我应该使用

  • 问题内容: 我正在玩Java的反射API,并尝试处理一些字段。现在,我要确定字段的类型。字符串很简单,只需执行即可。其他非派生类也是如此。但是,如何检查派生类?例如作为的子类。我无法找到任何或方法。我是否需要遍历所有人并自己找到超人? 问题答案: 您需要此方法: 一般情况下,(以上)应替换为并应替换为 从JavaDoc: 确定此对象表示的类或接口是否与指定参数表示的类或接口相同或超类或超接口。如果

  • 问题内容: 怎么有一个类的实例是,而该类不是的子类呢?这是一个例子: 问题答案: 在Python 2中, 类型 和 类 不是同一对象,特别是对于老式类, 它与对象是不同的。因此这是可能的,因为老式类的实例实际上是与其类不同的类型(): 这在新型类中得以解决: 旧样式类不是类型,新样式类是: 旧样式类被声明为已弃用。在Python 3中,只有新型类。等效于并且您的代码将在两次检查中产生。 看一下这个

  • 问题内容: 我想知道一个类是否为枚举,但是我想我缺少了一些东西: 它给我一个错误,指出Enum.class无效。那么,如何检查类是否为枚举?我很确定有可能确定这一点,但我无法做到。 谢谢 问题答案: 正确的语法为: 但对于枚举,这是一种更方便的方法: 更新:对于带有主体的枚举项(例如,覆盖方法),这实际上将不起作用。在这种情况下,请使用 参考:

  • 问题内容: 假设我有一个西服套装和四个西服套装子类别:Heart,Spade,Diamond和Club。 我有一个方法,该方法接收西装作为参数,这是一个类对象,而不是实例。更准确地说,它可能仅接收以下四个值之一:Heart,Spade,Diamond,Club。我该如何做出保证这种事情的断言?就像是: 我正在使用Python 3。 问题答案: 您可以使用像这样。

  • 问题内容: 我需要保留Swift元类型的集合并编写一个函数,该函数将检查给定对象是否是其中之一的实例。我可以在Java中轻松做到这一点: 但是,我不知道如何在Swift中做到这一点: 这甚至可以在Swift中完成吗? 问题答案: 不幸的是,您目前只能对运算符使用命名类型,还不能对其使用任意的元类型值(尽管实际上 应该 可以使用IMO )。 假设您可以控制要与之进行比较的元类型的创建,则达到相同结果