让
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
。