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



我正在检查扩展类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,我不能编辑游戏类。在这种情况下,只有厨房,浴室和hasFurniture可以编辑。

也忽略我的类名,它们只是示例名,这样你就不会不小心混淆类了

您正在浪费多态性的好处。您不希望使用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;
    }
}

编辑:另外,Eran指出这种层次结构一开始就没有多大意义,这是正确的——但这是一个更大的问题。

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

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在他的回答中做的那样,如下所示。人(真正的人,不是超级英雄)不会飞。如果被推下悬崖,他们就会死。所以person类不应该处理"如果我不是一个真正的人,我实际上是一个...."的可能性;让子类来处理。

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

多亏了Eran,我刚刚解决了这个问题。

我的问题是我正在转换一个错误的元素。在这种情况下,我正在投射ItemStack(带有附加数据的Item)而不是Item。通过添加。getitem(),我有望解决这个问题。

谢谢你的帮助,祝你有美好的一天!

最新更新