检查列表中是否存在特定类的实例

时间:2016-04-05 23:04:55

标签: java class linked-list variable-assignment instanceof

好的,如果已经回答,请道歉。我试着看,但我找不到答案。

现在,我有一个链表实用程序类(在一个方向链接),其中包含用于不同事物的各种通用实用程序方法。我要做的是创建一个方法,它能够将参数作为任何给定类的实例,然后继续检查列表中是否存在此类的实例,如果是,则返回true,如果是,则返回false没有。列表本身包含几个不同类的实例。

该方法将与详细说明游戏板上空间内容的列表结合使用:如果空间包含敌人,则显示敌人的图标并使空间无法通行,如果它包含一个项目,则显示项目的图标等等。这里真正的踢球者是该方法应该能够处理任何和所有类,所以我不能使用像:

if(foo instanceof Enemy) { 。 。 。 }

这是我最初尝试做的事情:     //此方法位于LinkedList类

public boolean exists(Object o)
{
    int i = 0;
    boolean output = false;
    //koko() returns the size of the linked list
    while(i < koko() && !output)
    {
        //alkio(i) returns an Object type reference to the entity in index i
        if(alkio(i) instanceof o.getClass())
        {
            output = true;
        }
    }
    return output;
}

但结果如下:https://www.dropbox.com/s/5mjr45uymxotzlq/Screenshot%202016-04-06%2001.16.59.png?dl=0

是的,这是一个家庭作业(或者更确切地说,是大作业的一部分),但老师不会在凌晨两点回答而且我的谷歌太弱了。

halp plz

  • 纳尔

3 个答案:

答案 0 :(得分:1)

instanceof的动态方式是使用Class.isInstance()方法:

  

确定指定的Object是否与此Class所代表的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。

因此,alkio(i) instanceof o.getClass()应写为o.getClass().isInstance(alkio(i))

答案 1 :(得分:0)

这个怎么样?

public static void main(String[] args)
{
    Integer myInt = 1;
    System.out.println(exists(Arrays.asList(1, 2, 3), myInt)); //true
    System.out.println(exists(Arrays.asList("1", "2", "3"), myInt)); //false

}

/**
 * Returns whether an object exists in @list that is an instance of the class of object @o.
 */
public static boolean exists(List<?> list, Object o)
{
    return list == null || o == null ? false : list.stream().filter(o.getClass()::isInstance).findAny().isPresent();
}

答案 2 :(得分:0)

如果我理解你的问题,那么你需要将类传递给你的方法,而不是类的实例:

public boolean exists (Class checkClass) {
    ...
    if (item.getClass().equals(checkClass)) {
        return true;
    }
    ...
}

然后将其称为:

if (myList.exists(Enemy.class)) {
    ...
}

但是你应该考虑一个不同的模型,因为这显示了一些相当差的面向对象设计。更好的方法是使用interface表示可以在地图上显示的所有内容。类似的东西:

public enum MapObjectType {
    ENEMY, ALLY, WALL;
}

public interface MapObject {
    MapObjectType getType();
}

然后,可以放入代表地图的列表中的每个类都应该实现此接口。例如:

public class Enemy implements MapObject {

    @Override
    public MapObjectType getType() {
        return MapObjectType.ENEMY;
    }
}

然后你的方法可能更明智:

public boolean hasObjectOfType(MapObjectType type) {
    ...
    if (item.getType().equals(type)) {
        return true;
    }
    ...
}