调用 b.y() 时,实现多个接口的类(如下所示)会导致错误吗?

Posted

技术标签:

【中文标题】调用 b.y() 时,实现多个接口的类(如下所示)会导致错误吗?【英文标题】:Can a class implementing multiple interfaces (shown below) cause errors when b.y() is called? 【发布时间】:2014-09-25 20:04:39 【问题描述】:

假设类 A 实现了接口 B 和 C。

许多书籍通常使用以下格式之一:

B b = new A();

C c = new A();

假设方法x在接口B中指定,方法y在接口C中指定。

问题:

对象b可以使用下面的语法调用接口C中指定的方法y吗?

b.y();

能否请您根据具体的 java 示例给出答案(例如List 接口和ArrayListsLinkedLists)。

【问题讨论】:

你不能试试吗? 您必须将引用转换为要引用的类型。 (或者简单地将其转换为实现这两个接口的类。) (并且“根据特定的 java 示例给出答案”听起来很像家庭作业问题。自己做作业。) 不,你不能使用b.X()调用方法Y 感谢您的回复。这绝对不是为了家庭作业——这是为了更好地理解。我使用的计算机受到严格限制 - 无法安装其他软件。 【参考方案1】:

在编译时,方法调用是根据调用它们的表达式(或值)的类型来绑定的。这称为编译时类型或静态类型。

如果该类型(或其超类型)包含该名称的可访问方法,该方法满足提供的参数,则编译将通过该调用。如果不存在这样的方法,编译将失败。

考虑LinkedList 实现ListDeque

【讨论】:

那么,你是在建议 b.X();会导致编译时错误吗? @QNZ9WTX9W9 如果该类型(或其超类型)包含该名称的可访问方法,该方法满足提供的参数,则编译将通过该调用。如果不存在这样的方法,编译将失败。 @QNZ9WTX9W9 X()B 中声明,因此在B 类型的表达式上调用它很好,假设这里bB 类型。【参考方案2】:

问题一:对象'b'可以使用下面的语法调用接口C中指定的方法y吗?

   b.x();

不可以。

b.y() 调用一个名为y 的方法。

现在我想您可以编写一些实现BC 的类,以便它的方法y() 的实现调用y()。但是b.y() 调用总是以调用y() 方法开始。

问题2:对象'b'可以使用下面的语法调用接口C中指定的方法y吗?

   b.y();

不可以。

b 的静态类型是BB 确实定义了一个名为y 的方法。这会给你一个编译错误,说B 中没有y() 方法。


问题 3:那么,您是否建议使用 b.x();会导致编译时错误吗?

没有。 b 有一个静态类型BB 定义了方法x()。因此调用是有效的。

【讨论】:

谢谢@Stephen C。我已根据您的 cmets 编辑了问题。我也做了一个重要的改变。它适用于 b.y() 吗?

以上是关于调用 b.y() 时,实现多个接口的类(如下所示)会导致错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

从具有相同方法名称的多个接口继承

█■为啥要用实现接口的类实例化接口呢? ?

动态实例化实现接口并调用接口方法的类

监听器事件事件源事件注册深度剖析

多个.so文件使用微服务独立部署,但是部署的时候端口又不一样,调用API时又要统一ip和端口,应该怎么办?

如何利用java反射构造一个类,使之实现一个接口和一些功能