0

public class A{
    public MyType myMethod(){...}
}

public class B extends A{
    @Override
    public MyType myMethod(){...}
}

是一个任意的类。为什么 MyType 必须是 MyAdvancedType 的父类型?如果我们允许 MyAdvancedType 可以是任意类型会发生什么?

4

2 回答 2

2

我想您在第二个示例中指的是 MyAdvancedType

有一个简单的解释你有以下LOC:

A a = new B();

现在,当你尝试调用myMethod对象 a 时,实际上你会调用B类中的 overriden 方法。

现在,被覆盖的方法返回 的对象MyAnvancedType,但是您在类上调用了该方法A,这意味着您只知道可以获取 的对象MyType。因此,JVM 转换MyAnvancedTypeMyType,您将使用MyType对象,甚至不怀疑您正在使用MyAdvancedType

并回答你的第二个问题。即使编译器允许您使用任意类型,您也会得到ClassCastException,因为编译器会尝试强制转换MySomeOtherTypeMyType

于 2013-09-18T05:14:47.590 回答
1

如果我理解你:

为什么 MyType 必须是 MyAdvancedType 的父类型?

因为您自己写MyAdvancedTypeMyTypeclass Bclass A您的示例中的子级)的子级,并且 Java 意识形态只允许一个父级。

如果我们允许 MyAdvancedType 可以是任意类型会发生什么

Java 将您识别MyAdvancedType为下一个类型ObjectMyTypeMyAdvancedType. 例如在这种情况下:

class A{
    void someMethod(){
        System.out.println("Class A method");
    }
}
class B extends A{}
...
A var = new B();
var.someMethod();

A 类的执行方法。但在这种情况下:

class B extends A{
    @Overide //This string is optionally but good practice.
    void someMethod(){
        System.out.println("Class B method");
    }
}
...
A var = new B();
var.someMethod();

执行了 B 类的重写方法。这种行为被称为polymorphism

于 2013-09-18T05:06:41.153 回答