让
public class A{
public MyType myMethod(){...}
}
和
public class B extends A{
@Override
public MyType myMethod(){...}
}
是一个任意的类。为什么MyType必须是MyAdvancedType的父类型?如果我们允许MyAdvancedType可以是任意类型会发生什么?
答案 0 :(得分:2)
我想你的意思是第二个例子中的MyAdvancedType
有一个简单的解释你有以下LOC:
A a = new B();
现在,当您尝试在对象a上调用myMethod
时,实际上,您将在B
类方法中调用override。
现在,overriden方法返回MyAnvancedType
的对象,但是您在类A
上调用了该方法,这意味着您可以获得MyType
的对象。因此,JVM会将MyAnvancedType
转换为MyType
,您将使用MyType
对象,即使不怀疑您正在使用MyAdvancedType
回答你的第二个问题。即使编译器允许您使用任意类型,也会得到ClassCastException
,因为编译器会尝试将MySomeOtherType
强制转换为MyType
答案 1 :(得分:1)
如果我理解你:
为什么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
。