class parent{
}
class child extends parent{
}
class grandson extends child{
}
class Animal
{
}
class Cat extends Animal
{  public void testAnimal(child a)
  {
    System.out.println("Red");
  }
}
class BlackCat extends Cat
{  public void testAnimal(parent a)
    {
     System.out.println("Green");
  }
}
public class test
{
  public static void main(String[] args)
  {    BlackCat c = new BlackCat();
    c.testAnimal(new grandson()); //29
    c.testAnimal(new child()); //30
  }}
20和30 这两行代码为什么会编译出错?如果将Cat类和BlackCat类中的两个方法换个位置,如下
class Cat extends Animal
{
  public void testAnimal(parent a)
  {
    System.out.println("Red");
  }
}
class BlackCat extends Cat
{  public void testAnimal(child a)
    {
     System.out.println("Green");
  }
}
其他都不变,为什么就不会编译出错,谁能给我解释一个理由,代码很简单,希望大家看仔细了再回答问题。
不知道这个问题以前有人问过没有,如果没有,希望和大家一起讨论和学习。

解决方案 »

  1.   

    类型不同呀,要强制转换一下
    c.testAnimal((child)new grandson()); //29
    c.testAnimal((parent)new child()); //30
      

  2.   

    我的回答有错误,我也编译和运行了,没有问题,结果是2个"red"
      

  3.   

    很明显Cat是BlackCat的父类,你调用的是BlackCat的方法,子类的方法覆盖了父类的方法,你30行调用的参数不是子类方法所需的。
      

  4.   

    如果要加强制类型,那么就限定了它的选择性..
    如c.testAnimal((child)new grandson()); 那么就选择Cat类里边的方法...
      

  5.   

    我不太清楚你们jdk的版本大概是多少,我的是1.4.0,在第一种情况下编译出错提示如下
    "test.java": reference to testAnimal is ambiguous; both method testAnimal(imsmap.child) in imsmap.Cat and method testAnimal(imsmap.parent) in imsmap.BlackCat match at line 42, column 7
    我把我发帖子的程序又拷贝下来执行的,我写的没有错。
    这好像是个协变和反协变的问题
      

  6.   

    我编译了你的代码, 没有任何错误, 运行也正常,可能是你的jdk版本的问题
      

  7.   

    我编译了你的代码, 没有任何错误, 运行也正常,可能是jdk版本的问题