问题标签 [instanceof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2501 浏览

java - Java 对象实例

说明说:创建一个 equals 方法,该方法接受对象引用,如果给定对象等于该对象,则返回 true。*提示:你需要'instanceof'并转换为(位置)

我有:

但我做错了,我不知道我的问题是什么。我是对象的新手,所以这让我有点困惑..

0 投票
4 回答
4348 浏览

java - Java:从 X 到 Y 的未经检查的强制转换/如何实现 castOrNull

我已经实现了这个功能:

这给了我编译器警告:

我不太明白。try/catch我在这里做的不是检查吗?我可以忽略警告吗?

我的功能会按预期工作吗?我将如何正确实施它?

我也尝试过obj instanceof Y检查,但由于 Java 处理泛型的方式,它不起作用。

顺便说一句,这个函数对我来说似乎很有用(使其他一些代码更干净)。我想知道Java中是否已经存在这样的功能?


我想使用它的一个例子:

我的代码中经常出现这样的情况。而且我认为这比其他任何东西都更具可读性和简单性。但是,如果您有任何关于如何使该代码更简单的建议,请给我一个更好的建议。

0 投票
6 回答
12221 浏览

java - java:结合instanceof和cast?

(请不要建议我应该抽象X更多并添加另一种方法。)

在 C++ 中,当我有一个类型的变量x并且如果它也是类型(作为 的子类)X*我想做一些特定的事情,我正在写这个:Y*YX

同样的事情在 Java 中似乎是不可能的(或者是吗?)。

我已经阅读了这段 Java 代码:

有时,当您没有变量x但它是一个更复杂的表达式时,正是因为这个问题,您需要一个 Java 中的虚拟变量:

(常见的something()iterator.next()。而且你看到你也不能真正调用它两次。你真的需要虚拟变量。)

你在这里根本不需要x——你只是拥有它,因为你不能instanceof立即对演员表进行检查。再次将其与相当常见的 C++ 代码进行比较:

正因为如此,我引入了一个castOrNull可以避免虚拟变量的函数x。我现在可以这样写:

实施castOrNull

现在,有人告诉我,以这种方式使用此castOrNull功能是对. 这是为什么?(或者更笼统地说:你会同意并认为这是邪恶的吗?如果是,为什么会这样?或者你认为这是一个有效的(可能是罕见的)用例吗?)


如前所述,我不想讨论这种沮丧的使用是否是一个好主意。但是让我简要说明一下为什么我有时会使用它:

  1. 有时我会遇到这样的情况,即我必须在为非常特定的事物添加另一种新方法(在一种特定情况下仅适用于单个子类)或使用此类instanceof检查之间做出选择。基本上,我可以选择添加功能doSomethingVeryVerySpecificIfIAmY()或进行instanceof检查。而在这种情况下,我觉得后者更干净。

  2. 有时我有一些接口/基类的集合,对于所有类型的条目Y,我想做一些事情,然后将它们从集合中删除。(例如,我有一个树结构的情况,我想删除所有空叶子的孩子。)

0 投票
3 回答
604 浏览

java - 在 JAVA 中动态加载一个类 - Anomaly

伙计们,我在 Java 动态类加载方面遇到了一个稍微不同的问题。我必须将一个对象(比如说 A 类的对象 A1)传递给 B 类的另一个对象 B1 的构造函数,以便 A1 的详细信息存储在 B1 中。B1 不知道它正在接收什么样的对象。所以它只知道 A1 是一个对象。

现在我在 B 类中有函数,它接受对象 C1 并检查它是否等于对象 A1。所以基本上我必须检查

  1. 如果对象 C1 也是 A 类的类型。(实际上我还没有超过这一点。)
  2. 如果对象内部的值相同

我尝试了一个解决方案:

将对象 A1 存储在 B1 中时,我还存储了类“A”的名称,因为对象 B1 仅获取对象 A1 而不是类名 A。

我一直在尝试不同的代码来获取类类型以进行 instanceof() 比较,但我没有成功。有什么建议吗?

我什至试过这个但同样的错误

有关如何进行的任何指示都会非常有帮助!

解决方案是使用:isInstance 而不是 instanceof

此问题还附带其他问题。让我用下面的评论更新它。现在,我必须在 C1 和 A1 中比较一个值,比如 AGE,在 B1 中。现在我该怎么做?如果我尝试函数或值,我会给我编译器错误,因为编译器仍然不知道对象 C1 和 A1 的类类型

我也可以一开始就保存 X1 而不是 A1。现在我可能需要检查不同的属性检查,例如 ADDRESS。这极大地改变了问题的维度。

0 投票
2 回答
408 浏览

java - 使用对象树时应该避免使用 instanceof 吗?

我有一个代表不同语言结构的类层次结构:

这些类的对象形成复杂的树层次结构,我必须对其执行各种结构检查,例如,如果节点是 IteratedExpression,那么它的第一个子节点应该是 IndexingExpression。如果检查只涉及一个级别,我可以使用访问者模式,但在更复杂的情况下,如下例所示,我使用的是 instanceof。

是正确使用 instanceof 还是我的设计有缺陷?有哪些替代方案?

由于提出了一些替代方案,我想强调问题的第一部分:

是正确使用 instanceof 还是我的设计有缺陷?

0 投票
6 回答
3330 浏览

java - 传递 Collections.unmodifiable* 一个已经用 Collections.unmodifiable* 包装的实例的效率有多低?

我有一些由不同的自定义(源代码不可用)框架完成的部分工作,这些框架交还 Map 实例。不幸的是,这些框架在返回的 Map 实例中并不一致,这些实例已经用 Collections.unmodifiableMap 包装。为了确保我的代码具有更高程度的不变性(以便于多线程使用),我刚刚对这些框架返回的任何内容统一调用 Collections.unmodifiableMap。

我意识到我的这部分设计可能存在性能问题。在某些情况下,我调用 Collections.unmodifiableMap 向它传递一个实例,该实例已经被框架通过同一个调用包装。而且我的重新包装可能会导致整个实例的额外方法调用。

似乎使用“instanceof Collections.UnmodifiableMap”不起作用。如果我当前引用的 Map 实例需要被包装,我找不到任何方法来检测(不包括使用反射,这在这种情况下不是一个选项 - 太慢了)。

问题:

    A) Collections.unmodifiableMap() 方法是否检查它是否传递了 UnmodifiableMap 的实例,如果是,则返回相同的引用(从而避免在调用该方法之前需要检查)?
    B)为了主动避免接收到修改异常,有没有办法查询一个Map实例(除了使用反射)来检测它是否可变(或不可变)?
    C) 如果 A 的答案是否定的,那么 JVM/HotSpot 中是否有一些效率可以消除通过多个方法跃点调用以到达核心实例的开销?
0 投票
2 回答
54102 浏览

java - 检查一个类是否是 java.lang.Enum

我想知道一个类是否是一个枚举,但我想我错过了一些东西:

它给了我一个错误,说 Enum.class 无效。那么我如何检查一个类是否是一个枚举?我很确定可以确定,我只是无法得到它。

谢谢

0 投票
12 回答
32944 浏览

java - 为什么要在 instanceOf 之后强制转换?

在下面的示例中(来自我的课程包),我们希望为Square实例c1提供其他对象的引用p1,但前提是这两个对象的类型兼容。

我在这里不明白的是,我们首先检查那p1确实是 a Square,然后我们仍然投射它。如果是Square,为什么要投?

我怀疑答案在于表面类型和实际类型之间的区别,但我仍然感到困惑......

编辑:
编译器将如何处理:

Edit2:
instanceof检查实际类型而不是表观类型的问题吗?然后演员表改变了明显的类型?

0 投票
7 回答
9766 浏览

java - 如何使用多态性而不是 instanceof?(为什么?)

如果我们采用下面的代码:

更喜欢多态性是什么意思instanceof,顺便说一句,为什么它更好?

编辑: 我明白什么是多态性;我缺少的是如何使用它而不是instanceof.

0 投票
9 回答
48178 浏览

javascript - 正则表达式的类型

有没有办法检测一个 JavaScript 对象是否是一个正则表达式?

例如,我想做这样的事情:

这可能吗?

谢谢!

编辑:感谢所有的答案。看来我有两个非常好的选择:

或者

任何一种方法的主要优点/缺点?

再次感谢!