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

Checking if an instance of a specific class exists in a list

好的,很抱歉,如果已经回答了这个问题。我试着寻找,但没有找到答案。

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

的实例

该方法将与游戏板上 space 的详细内容列表结合使用:如果 space 包含敌人,显示敌人的图标并制作space 无法通行,如果包含物品,则显示物品的图标等等。这里真正重要的是该方法应该能够处理任何和所有 classes,所以我不能使用类似的东西:

if(foo instanceof Enemy) { . . . }

这是我最初尝试做的事情: //这个方法在LinkedList中class

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

是的,这是作业(或者更确切地说,是大作业的一部分)但是老师不会在凌晨两点回答我的google-fu太弱了

请加油

这个怎么样?

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();
}

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

的实例
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();
}

那么每个可以放入表示地图的列表的 classes 都应该实现这个接口。例如:

public class Enemy implements MapObject {

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

那你的方法可能更明智:

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

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

Determines if the specified Object is assignment-compatible with the object represented by this Class. This method is the dynamic equivalent of the Java language instanceof operator.

所以,alkio(i) instanceof o.getClass()应该写成o.getClass().isInstance(alkio(i))