让
public class A{
public MyType myMethod(){...}
}
和
public class B extends A{
@Override
public MyType myMethod(){...}
}
是一个任意的类。为什么 MyType 必须是 MyAdvancedType 的父类型?如果我们允许 MyAdvancedType 可以是任意类型会发生什么?
让
public class A{
public MyType myMethod(){...}
}
和
public class B extends A{
@Override
public MyType myMethod(){...}
}
是一个任意的类。为什么 MyType 必须是 MyAdvancedType 的父类型?如果我们允许 MyAdvancedType 可以是任意类型会发生什么?
我想您在第二个示例中指的是 MyAdvancedType
有一个简单的解释你有以下LOC:
A a = new B();
现在,当你尝试调用myMethod对象 a 时,实际上你会调用B类中的 overriden 方法。
现在,被覆盖的方法返回 的对象MyAnvancedType,但是您在类上调用了该方法A,这意味着您只知道可以获取 的对象MyType。因此,JVM 转换MyAnvancedType为MyType,您将使用MyType对象,甚至不怀疑您正在使用MyAdvancedType
并回答你的第二个问题。即使编译器允许您使用任意类型,您也会得到ClassCastException,因为编译器会尝试强制转换MySomeOtherType为MyType
如果我理解你:
为什么 MyType 必须是 MyAdvancedType 的父类型?
因为您自己写MyAdvancedType为MyType(class B是class A您的示例中的子级)的子级,并且 Java 意识形态只允许一个父级。
如果我们允许 MyAdvancedType 可以是任意类型会发生什么
Java 将您识别MyAdvancedType为下一个类型Object:MyType和MyAdvancedType. 例如在这种情况下:
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。