Java方法重写,子类采用超类型的参数类型

时间:2018-05-02 12:06:24

标签: java oop method-overriding

在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句):

abstract class A
{
  abstract CharSequence getName() throws NameNotAvailableException;
}

class B extends A
{
  String getName()
  {
    return "foo";
  }
}

但是,参数类型怎么样(如果A需要T,那么B为什么不采用? super T),如下所示:

abstract class A
{
  abstract void setName(final String name);
}

class B extends A
{
  void setName(final CharSequence name)
  {

  }
}

让我们考虑一下我认为对我来说完全合乎逻辑的代码:

void handleA(final A a)
{
  a.setName("foo");
}

handleA(new B());

所以我要说的是B在使用A的代码环境中仍然有效。

1 个答案:

答案 0 :(得分:1)

因为CharSequence不仅是String,而StringCharSequence。换句话说,CharSequence也可以是CharBufferSegmentStringStringBufferStringBuilder

这就是为什么您无法将setName(String)的参数类型更改为CharSequence