Java 在这种情况下,我如何避免打字检查

Java 在这种情况下,我如何避免打字检查,java,typechecking,Java,Typechecking,情况如下: 我们有一个有玩家和物品的游戏。当一个玩家在他们的库存中有所有3个特定的物品并组装它们(地图上每个物品只有一个)时,游戏就赢了。物品有一个非常简单的界面,玩家可以调用use()。还有其他实现项接口的类,这些类已从代码段中删除。如果我忽略了OOP的基本原则,我可以说,当玩家使用其中一个时,我们会迭代玩家的库存,并检查其中是否有所有3种特定类型的项目。我如何避免这样做 public interface Item{ public void use(); } public class

情况如下:


我们有一个有玩家和物品的游戏。当一个玩家在他们的库存中有所有3个特定的物品并组装它们(地图上每个物品只有一个)时,游戏就赢了。物品有一个非常简单的界面,玩家可以调用
use()
。还有其他实现
接口的类,这些类已从代码段中删除。如果我忽略了OOP的基本原则,我可以说,当玩家使用其中一个时,我们会迭代玩家的库存,并检查其中是否有所有3种特定类型的项目。我如何避免这样做

public interface Item{
    public void use();
}

public class SpecificItem1 implements Item{
    public void use(){...}
}

public class SpecificItem2 implements Item{
    public void use(){...}
}

public class SpecificItem3 implements Item{
    public void use(){...}
}

public class Player{

    ArrayList<Item> inventory;

    public void didWeWin() {

        int numOfSItems = 0;

        for(Item i : inventory) {
            if(i instanceOf SpecificItem1)
                numOfSItems++;
            if(i instanceOf SpecificItem2)
                numOfSItems++;
            if(i instanceOf SpecificItem3)
                numOfSItems++;
        }

        if(numOfSItems == 3)
            win();
    }

}
公共接口项{
公共用途();
}
公共类SpecificItem1实现该项{
public void use(){…}
}
公共类SpecificItem2实现该项{
public void use(){…}
}
公共类SpecificItem3实现该项{
public void use(){…}
}
公开课选手{
ArrayList目录;
公共无效迪德温(){
int numOfSItems=0;
用于(项目一:存货){
如果(i SpecificItem1的实例)
numositems++;
如果(i SpecificItem2实例)
numositems++;
如果(我是SpecificItem3的实例)
numositems++;
}
如果(numOfSItems==3)
赢();
}
}

您可以使用
getClass()
获取项目的类,然后计算唯一类的数量:

public void didWeWin() {
   if (inventory.stream().map(Object::getClass).distinct().count() == 3L) {
       win();
   }
}

如果库存中可能包含不属于赢家条件的其他种类的物品,检查至少有三种不同种类的物品是不够的。在这种情况下,您可以使用该方法检查win条件所需的项目类

//在Java 9+中使用List.of works,在Java 8中使用Arrays.asList

私有静态列表您总是调用
numOfSItems++
对于所有情况,如果
s全部删除,您只需删除
。是否有其他类实现
接口?如果没有,正如您所说的“地图上每一个都只有一个”,您可以只检查
库存的大小
还有其他类实现
接口。实际上,如果您仔细阅读问题,它会说“地图上每一个只有一个”—您可以只检查列表的大小。除非有其他类实现该接口,但问题中缺少该信息