检查扩展类是否是接口的实例

时间:2014-08-10 23:33:37

标签: java interface casting

我正在尝试检查扩展B类的A类是否是某个接口的实例。

基本上这是我的设置:

public class House
{
    (variables)

    public House(variables) {...}
}

public class Kitchen extends House implements IFurniture
{
    (variables)

    public Kitchen(variables)
    {
        super(variables);
    }
}

public class Bathroom extends House implements IWalls

依旧......

我有一个方法,我正在获得一个铸造,House版的厨房和浴室。 我基本上想要这样做:

public boolean hasFurniture(House house)
{
    if (house instanceof IFurniture){return true;}
}

我是否需要使用house.getClass()。getInterfaces(),并且考虑到参数已被转换,它是否会工作?

问题是我正在为游戏编写一个mod而我无法编辑游戏类。在这种情况下,只能编辑厨房,浴室和家具。

同样忽略我的类名,它们只是示例名称,因此您不会意外混淆类。

3 个答案:

答案 0 :(得分:1)

你正在浪费多态性的好处。您不想使用instanceof的接口来检查对象是否具有属性。 implementsextends表示IS-A,而不是HAS-A。你显然想要后者。这样做是这样的:

public interface IFurniture {
    public boolean hasFurniture();
}


public class House implements IFurniture
{
    (variables)

    public House(variables) {...}

    @Override
    public boolean hasFurniture() {
        return false;
    }
}

public class Kitchen extends House
{
    (variables)

    public Kitchen(variables)
    {
        super(variables);
    }

    @Override
    public boolean hasFurniture() {
        return true;
    }
}

编辑:此外,伊兰正确地指出,这种等级制度首先没有大量意义 - 但这是一个更大的问题。

答案 1 :(得分:1)

让我们使用更易理解的类层次结构。 您正在考虑像这样的问题实例:

public class Person{

    public void die(){
        System.out.println(this + " died");
    }

    public void pushOffCliff(){
        if(this instanceof Flyable)
            Flyable f = (Flyable)this;
            f.fly();
        else
            die();
    }
}

public interface Flyable{

    public void fly();
}

public class Superhero extends Person implements Flyable{

    public void fly(){
        System.out.println("Up, up, and away!");
    }
}

使用像Patrick这样的类扩展和覆盖系统在他的回答中更有意义,如下所示。人(真正只是人而不是超级英雄)不会飞。当从悬崖上推下时,它们应该死掉。所以,如果我不是真正的人,那么这个人不应该处理这个问题,我实际上是......"可能性;让子类处理它。

public class Person{

    public void die(){
        System.out.println(this + " died");
    }

    public void pushOffCliff(){
        die();
    }
}

public interface Flyable{

    public void fly();
}

public class Superhero extends Person implements Flyable{

    public void fly(){
        System.out.println("Up, up, and away!");
    }

    @Override
    public void pushOffCliff(){
        fly();
    }
}

答案 2 :(得分:0)

我刚刚解决了它,感谢Eran。

我的问题是我投了一个错误的元素。 在这种情况下,我正在使用ItemStack(带有附加数据的Item)而不是Item。 通过添加.getItem()我希望能解决问题。

感谢您的帮助,祝您度过愉快的一天!