在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
的代码环境中仍然有效。
答案 0 :(得分:1)
因为CharSequence
不仅是String
,而String
是CharSequence
。换句话说,CharSequence
也可以是CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
。
这就是为什么您无法将setName(String)
的参数类型更改为CharSequence
。