This question already has an answer here:
Why are contravariant parameter types in Java not allowed for overriding?
(1个答案)
2年前关闭。
在Java中,我们可以缩小返回类型和throws异常类型的范围(甚至删除throws子句):
但是,关于参数类型(如果A采用
让我们考虑一下我认为对我来说完全合乎逻辑的这段代码:
所以我要说的是,
(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
,而String
是CharSequence
。换句话说CharSequence
也可以是CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
。
这就是为什么您不能将setName(String)
的参数类型更改为CharSequence
的原因。