This question already has an answer here:
Why are contravariant parameter types in Java not allowed for overriding?

(1个答案)


2年前关闭。




在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的代码上下文中仍然有效。

最佳答案

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

这就是为什么您不能将setName(String)的参数类型更改为CharSequence的原因。

10-07 19:31
查看更多