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 { }


AppleBanana均为Fruit,但Apple不是BananaBanana不是Apple。因此,您不能真正将Banana给予期望Apple的人,但是将BananaApple给予期望只是Fruit的人是有效的。

所以,

public void method(Fruit fruit) {


与签名不同

public void method(Apple apple) {


因为,如果这样的话,则意味着以下内容与上述内容具有相同的签名

public void method(Banana banana) {


并且签名必须在覆盖(实现)方法时匹配。

关于java - 传递需要基类对象的派生类对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11407504/

10-10 20:17