Java 铸造问题(可能的解决方法)

Java 铸造问题(可能的解决方法),java,inheritance,casting,Java,Inheritance,Casting,好吧,大学给我布置了一个作业,我就是想不明白这个问题是怎么回事,我是班上唯一一个走到这一步的人,我的讲师也没有回复我 基本上是继承和多态性,我们使用父类,然后从父类创建子类 private HashMap<String,Aircraft> allAircraft = new HashMap<String,Aircraft>(); Aircraft plane = new Plane(reg,pass,cargo); private HashMap allairraft=

好吧,大学给我布置了一个作业,我就是想不明白这个问题是怎么回事,我是班上唯一一个走到这一步的人,我的讲师也没有回复我

基本上是继承和多态性,我们使用父类,然后从父类创建子类

private HashMap<String,Aircraft> allAircraft = new HashMap<String,Aircraft>();
Aircraft plane = new Plane(reg,pass,cargo);
private HashMap allairraft=new HashMap();
飞机=新飞机(登记、通行证、货物);
所以家长不能使用children方法,我理解这背后的大部分概念,并设法让我的头脑绕过它。对于其中一种方法,我们被特别要求使用casting(尽管我被无数次地告知,如果我必须使用它,那么我应该重新构造),但对于另一种方法,我们被要求调用一种方法,该方法只针对两个儿童类,强制转换在这里不起作用,因为我不知道HashMap中的子类是什么

所以我的问题是,;在使用多态性时,与父类相比,我如何更喜欢两个子类方法


我的头脑简直是爆炸了。

如果你需要沮丧,那么你就不再使用多态性了。如果这正是老师想要的,那么您仍然可以通过测试对象的实际类型是否合适,以安全的方式进行降级:

if (plane instanceof SubClass1) {
    SubClass1 s = (SubClass1) plane;
    s.someSpecificMethod();
}
if (plane instanceof SubClass2) {
    SubClass2 s = (SubClass2) plane;
    s.someSpecificMethod();
}
如果这两个子类都使用此方法,则可能意味着它们实际上共享同一个接口。所以多态性可以在这里再次发挥作用:

public interface PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters();
}

public class SubClass1 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

public class SubClass2 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

if (plane instanceof PassengerTransporter) {
    PassengerTransporter p = (PassengerTransporter) plane;
    p.someSpecificMethodToAllPassengerTransporters();
}

如果需要向下转换,那么就不再使用多态性。如果这正是老师想要的,那么您仍然可以通过测试对象的实际类型是否合适,以安全的方式进行降级:

if (plane instanceof SubClass1) {
    SubClass1 s = (SubClass1) plane;
    s.someSpecificMethod();
}
if (plane instanceof SubClass2) {
    SubClass2 s = (SubClass2) plane;
    s.someSpecificMethod();
}
如果这两个子类都使用此方法,则可能意味着它们实际上共享同一个接口。所以多态性可以在这里再次发挥作用:

public interface PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters();
}

public class SubClass1 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

public class SubClass2 implements PassengerTransporter {
    void someSpecificMethodToAllPassengerTransporters() {
        // TODO : implement this
    }
}

if (plane instanceof PassengerTransporter) {
    PassengerTransporter p = (PassengerTransporter) plane;
    p.someSpecificMethodToAllPassengerTransporters();
}

如果此时无法更改基本/派生层次结构,请查看运算符。

如果此时无法更改基本/派生层次结构,请查看运算符。

您可以使用
getClass()
方法查找对象的确切类,或者,您也可以使用
instanceof
操作符询问对象是否属于特定类型。无论采用哪种方法,都不必向对象询问其特定的类,但在某些情况下,您没有选择。

您可以使用
getClass()
方法找到对象的确切类,或者您也可以使用
instanceof
操作符询问对象是否属于特定类型。无论哪种方式,要求对象指定其特定的类都不是很优雅,但在某些情况下,您没有选择。

完美,我知道一定有一种方法可以调节它。干杯,巴德!完美,我知道一定有办法调节它。干杯,巴德!