Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查扩展类是否为接口的实例_Java_Interface_Casting - Fatal编程技术网

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

Java 检查扩展类是否为接口的实例,java,interface,casting,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);

我试图检查扩展类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
等等

我有一个方法,我得到一个铸造的,房子版的厨房和浴室。 我基本上想这样做:

public boolean hasFurniture(House house)
{
    if (house instanceof IFurniture){return true;}
}
我是否需要使用house.getClass().getInterfaces(),并且考虑到参数已被强制转换,这是否有效

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


也可以忽略我的类名,它们只是示例名,这样你就不会意外地混淆类。

你在浪费多态性的好处。您不希望使用带有
instanceof
的接口来检查对象是否具有属性<代码>实现了和扩展了平均值是-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正确地指出,这种层次结构一开始没有多大意义——但这是一个更大的问题。

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

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

多亏了埃兰,我才解决了这个问题

我的问题是我投错了一个元素。 在本例中,我铸造的是ItemStack(带有附加数据的项),而不是Item。 通过添加just.getItem(),我有望解决这个问题


谢谢你的帮助,祝你度过愉快的一天

您的
hasfiture
方法有什么问题?顺便说一句,你的类层次结构没有多大意义。厨房不是房子。浴室不是房子。它们不应该是房屋的子类。它们可能是Room的子类,House应该包含一组Room。Eran,我的IDE说House不能转换为IFurniture,当然我的类层次结构没有多大意义,这不是重点。重点是显示我当前的设置。是的,我知道,但问题是我正在为游戏编写一个mod,我不能编辑游戏类。在这种情况下,只能编辑厨房、浴室和家具。我现在要把它加到问题上。