当前位置: 首页 > 知识库问答 >
问题:

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

孟光耀
2023-03-14

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

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

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

但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级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个答案

公西季
2023-03-14

因为字符序列不仅是字符串,而字符串字符序列。换句话说,字符序列也可以是字符缓冲器字符串字符串缓冲器字符串生成器

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

 类似资料:
  • 如果我有以下代码 首先,这甚至是可能的,因为它编译得很好。但是我不能使用中的方法执行操作: makeCan是否不同时返回Can和PromotionalCan?如果是这样,当返回PromotionalCan时,如何对变量进行操作?谢谢 编辑:PromotionalCan继承自Can,第二种方法是在PromotionalCan中

  • 我正在做一个体验,尝试用以下方式重写泛型类的方法: 为什么我不能?编译错误是 yGenFun。java:15:错误:对doX的引用不明确,Do中的方法doX(A)和MyGenFun中的方法doX(T)都匹配x.doX(“测试”);^其中A、T是类型变量:在类Do T中声明的extends对象扩展在类MyGenFun 1 error中声明的CharSequence 如果我注释“第1行”,我可以编译代

  • 我想这样设置参数的类型: 当我尝试这样做时,会引发错误:NameError:名称'Tree'未定义

  • 熟悉Java,但对静态编程语言相当陌生。 当子类参数与超类val同名时... Android Studio不会抛出验证错误,说明需要@Overder注释。但是,尝试从Business中访问引用参数而不是超类val(我觉得这就像覆盖)。 当然,我可以将参数命名为不同的名称,但我真的只想将名称传递给超类......否则不包括它在中的任何存储。 我忽略了什么吗?我很惊讶,即使我没有将FirstBusin

  • 如果我在java中有一个抽象的(或据我所知的)超类,如下所示: 我注意到,在重写这个方法时,子类可以使用自身作为返回类型,但不能使用参数: 为什么不允许这样做?我不是在寻求解决方案——我知道我可以在方法中使用< code>instanceof检查或其他方法,我更想知道为什么前者是可以接受的,而后者对编译器来说却不是。

  • 我是java初学者,我不理解这行代码是什么意思 平均值。为什么不能访问自己的方法。请详细解释如果类A正在实例化,那么为什么它的方法不可访问。