使用 instanceof 比较不同的类

Posted

技术标签:

【中文标题】使用 instanceof 比较不同的类【英文标题】:Comparing different classes using instanceof 【发布时间】:2020-07-17 21:55:47 【问题描述】: Entity.class 抽象母类 Player.class 扩展实体 Wall.class 扩展实体
                 public class slkjflksdjf
                 
                     ArrayList entities = new ArrayList();
                     Player player = new Player();
                     Wall wall = new Wall();

                     public slkjflksdjf()
                     

                         entities.add(player);
                         entities.add(wall);

                         for(int i = 0; i < entities.size(); i++)
                         

                             if(entities.get(i) instanceof Wall)
                             
                                 //do something
                             

                         

                     
                 

当通过我的实际完整大小的实体列表检查 instanceof 时,它会一遍又一遍地快速抛出“执行此操作”块,换句话说,快速播放音频剪辑哈哈。 所以从我可以看出它把墙和播放器都视为实体,所以即使它们都是原始实体的扩展,InstanceOf 也会导致它变为真?

【问题讨论】:

我可以用 50 个不同的 Floor 副本填充这个数组列表,这些副本也扩展了 Entity,当我知道并非所有东西都是 Wall 对象时,它仍然会执行 instanceof 块中的内容。因此,为什么我认为由于它们都扩展了 Entity 类而将它们都视为同一件事 请在您的问题中输入代码文本。然后使用“”工具查看格式化的文本,假设之前已经格式化。我为每个缩进级别使用三个空格。 或者它在输出时将所有对象视为相同?? 贴出代码文本。如果无法修复,请不要担心格式化。 多少个空格。这就是格式在每一行后面想要的。 14个左右? 【参考方案1】:

如果 Player 和 Wall 都扩展了 Entity 接口,您可以执行以下操作:

ArrayList<Entity> entities = new ArrayList<Entity>();
Player player = new Player();
Wall wall = new Wall();

entities.add(0, player);
entities.add(1, wall);

// entities.get(0) instanceof Player is true
// entities.get(0) instanceof Wall is false
// entities.get(0) instanceof Entity is true

// entities.get(1) instanceof Player is false
// entities.get(1) instanceof Wall is true
// entities.get(1) instanceof Entity is true

for(Entity entity : entities) 

  if(entity instanceof Player) 
    // is player
   else if(entity instanceof Wall) 
    // is wall
  


希望对你有帮助

【讨论】:

如果我试图选择一个特定的索引很有帮助,我不是虽然我正在遍历整个列表,但当所有元素都是数组内的随机索引时,我不会检查它是否是一堵墙这意味着我不能只指向要检查的特定索引 感谢您尝试 xD ooooh 在 forloop 中使用 i 作为索引而不是工作我明白你的意思 不需要 2 个数组或 2 个接口。 无论我尝试了多少次,它仍然无效。然后我意识到我已经在我的主游戏循环和 startgame 中都初始化了玩家,所以它在整个时间都在抛出 true,它被抛出在存在树对象的 0、0 坐标中......问题解决了看起来哈哈【参考方案2】:

如果 Player 是 Entity 的子类,而 Wall 是 Entity 的子类:

实体的玩家实例返回真。

如果 Wall 是 Entity 的子类:

wall instanceof Entity 返回 true。

但是反过来不成立(即实体instanceof Wall) 为什么?因为这就是 instanceof 运算符的定义方式。

此外,如果 Wall 和 Player 不相关(意味着一个不是另一个的子类或在接口的情况下实现)。 player instanceof Wall 返回 false 并且 wall instanceof Player 返回 false。

【讨论】:

以上是关于使用 instanceof 比较不同的类的主要内容,如果未能解决你的问题,请参考以下文章

JDK 14的新特性:instanceof模式匹配

比较typeof与instanceof

getClass()和instanceof以及类的equals方法

instanceof和getClass的区别

javascript中的类

JS == vs ===, typeof vs instanceof