public abstract class AbstractClass
{
public abstract void AbstractClassMethod();
}
public class DerivedClass extends AbstractClass {
@Override
public void AbstractClassMethod() {
// TODO Auto-generated method stub
}
}
public interface InterfaceObject
{
public void InterfaceObjectMethod(AbstractClass oAbstractClass);
}
public class TestAbstractParam implements InterfaceObject {
@Override
public void InterfaceObjectMethod(AbstractClass oAbstractClass) {
// TODO Auto-generated method stub
}
}
public class TestDerivedParam implements InterfaceObject {
@Override
public void InterfaceObjectMethod(DerivedClass oDerivedClass) {
// TODO Auto-generated method stub
}
}
编译TestDerivedParam类时出现错误。谁能解释这个原因?
更具体地说,问题是为什么方法不能接受期望基本类型的子类型参数?
谢谢!
最佳答案
在TestDerivedParam
方法中
public void InterfaceObjectMethod(DerivedClass oDerivedClass) {
与...不同
public void InterfaceObjectMethod(AbstractClass oAbstractClass);
在
InterfaceObject
中。您正在使用
@Override
批注,但未使用相同的方法签名。更具体地说,问题是为什么方法不能接受期望基本类型的子类型参数?
请参阅以下示例:
public class Fruit { }
public class Apple extends Fruit { }
public class Banana extends Fruit { }
Apple
和Banana
均为Fruit
,但Apple
不是Banana
,Banana
不是Apple
。因此,您不能真正将Banana
给予期望Apple
的人,但是将Banana
或Apple
给予期望只是Fruit
的人是有效的。所以,
public void method(Fruit fruit) {
与签名不同
public void method(Apple apple) {
因为,如果这样的话,则意味着以下内容与上述内容具有相同的签名
public void method(Banana banana) {
并且签名必须在覆盖(实现)方法时匹配。
关于java - 传递需要基类对象的派生类对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11407504/