Java 如何检查ArrayList是否包含来自其他类的对象

Java 如何检查ArrayList是否包含来自其他类的对象,java,arraylist,Java,Arraylist,我有两个职业,一个是战斗机职业,一个是玩家职业。Player类包含一个名为fleet的ArrayList,其中填充了玩家的飞船 我可以将战舰添加到玩家的舰队中而不会出现问题,但是当我尝试检查玩家舰队中是否有战斗机时,会出现一个错误,即战斗机无法解析为变量 我不明白为什么我可以在舰队中增加一架战斗机,但不能检查舰队中是否有战斗机 Fighter.java public class Fighter extends Ship { public Fighter(){ super(

我有两个职业,一个是
战斗机
职业,一个是
玩家
职业。
Player
类包含一个名为
fleet
ArrayList
,其中填充了玩家的飞船

我可以将战舰添加到玩家的舰队中而不会出现问题,但是当我尝试检查玩家舰队中是否有战斗机时,会出现一个错误,即
战斗机无法解析为变量

我不明白为什么我可以在舰队中增加一架战斗机,但不能检查舰队中是否有战斗机

Fighter.java

public class Fighter extends Ship {
    public Fighter(){
        super(9,1,1); //Sets attack and defense values
    }
}
import java.util.ArrayList;
import java.util.Scanner;

public class Player {

    ArrayList<Ship> fleet = new ArrayList<Ship>();

    public void takeAHit(){
        if (fleet.contains(Fighter)){                  //Error happens here
            System.out.println("Fighter found");
        }
    }

    public void buildFleet(){

        Scanner userInput = new Scanner(System.in);

        System.out.println("How many fighters?");

        int fighters = Integer.parseInt(userInput.next());

        while (fighters > 0){
            fleet.add(new Fighter());
            fighters--;
        }

        userInput.close();

    }
}
public class Core {

    public static void main(String[] args) {

        Player p1 = new Player();
        p1.buildFleet();
        p1.takeAHit();

    }
}
Player.java

public class Fighter extends Ship {
    public Fighter(){
        super(9,1,1); //Sets attack and defense values
    }
}
import java.util.ArrayList;
import java.util.Scanner;

public class Player {

    ArrayList<Ship> fleet = new ArrayList<Ship>();

    public void takeAHit(){
        if (fleet.contains(Fighter)){                  //Error happens here
            System.out.println("Fighter found");
        }
    }

    public void buildFleet(){

        Scanner userInput = new Scanner(System.in);

        System.out.println("How many fighters?");

        int fighters = Integer.parseInt(userInput.next());

        while (fighters > 0){
            fleet.add(new Fighter());
            fighters--;
        }

        userInput.close();

    }
}
public class Core {

    public static void main(String[] args) {

        Player p1 = new Player();
        p1.buildFleet();
        p1.takeAHit();

    }
}

不幸的是,
包含
方法需要类的实例,而不是类本身。
要引用一个类,您需要将
.class
附加到名称后面

我能想到的最佳解决方案是创建一个使用
instanceof
关键字的方法,类似于:

public boolean isFighterInFleet() {
    for(Ship ship : this.fleet)
        if(ship instanceof Fighter)
            return true;
    return false;
}
然后使用:

if (isFighterInFleet()){
而不是

if (fleet.contains(Fighter)){

不幸的是,
包含
方法需要类的实例,而不是类本身。
要引用一个类,您需要将
.class
附加到名称后面

我能想到的最佳解决方案是创建一个使用
instanceof
关键字的方法,类似于:

public boolean isFighterInFleet() {
    for(Ship ship : this.fleet)
        if(ship instanceof Fighter)
            return true;
    return false;
}
然后使用:

if (isFighterInFleet()){
而不是

if (fleet.contains(Fighter)){
在Java 8中:

this.fleet.stream().filter(ship->ship instanceof .findFirst().isPresent()

在Java 8中:

this.fleet.stream().filter(ship->ship instanceof .findFirst().isPresent()



如果你想检查一个类,你可以使用
Fighter.class
,但我不确定这是否有效。它确实消除了错误,但在我运行程序时没有找到Fighter。你可能必须对每个
方法使用
,并检查每个
entry.class==Fighter.class
,这是我能想到的唯一方法。其他人可能会有更好的选择你把buildFleet叫哪里?舰队似乎没有战斗机。啊,对不起,我没有包含Core.java文件。它只是在我的主要方法中运行。我已经在上面添加了我的Core.java。如果你想检查一个类,你可以使用
Fighter.class
,但我不确定这是否有效。它确实消除了错误,但是当我运行程序时,它找不到战斗机。你可能必须对每个
方法使用
,并检查每个
entry.class==fighter.class
这是我能想到的唯一方法。其他人可能会有更好的选择你把buildFleet叫哪里?舰队似乎没有战斗机。啊,对不起,我没有包含Core.java文件。它只是在我的主要方法中运行。我已经在上面添加了我的Core.java。我相信应该是
公共布尔值isFighterInFleet()
@TaylorLiss更改了。这个代码是否可以针对不同类型的船舶进行模块化?i、 e.我是否可以以某种方式传入我要检查的类的名称,并让它搜索该类型的船舶?您可以添加类型为
class
的参数和
if
语句use
ship.getClass().equals(参数)
。确保用实际的参数名替换
参数
。哈哈,太棒了!完美的非常感谢你!我认为这应该是
公共布尔值isFighterInFleet()
@TaylorLiss的改变,它是否有可能为不同类型的船舶将此代码模块化?i、 e.我是否可以以某种方式传入我要检查的类的名称,并让它搜索该类型的船舶?您可以添加类型为
class
的参数和
if
语句use
ship.getClass().equals(参数)
。确保用实际的参数名替换
参数
。哈哈,太棒了!完美的非常感谢你!