调用 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
接口和ArrayLists
、LinkedLists
)。
【问题讨论】:
你不能试试吗? 您必须将引用转换为要引用的类型。 (或者简单地将其转换为实现这两个接口的类。) (并且“根据特定的 java 示例给出答案”听起来很像家庭作业问题。自己做作业。) 不,你不能使用b.X()
调用方法Y
。
感谢您的回复。这绝对不是为了家庭作业——这是为了更好地理解。我使用的计算机受到严格限制 - 无法安装其他软件。
【参考方案1】:
在编译时,方法调用是根据调用它们的表达式(或值)的类型来绑定的。这称为编译时类型或静态类型。
如果该类型(或其超类型)包含该名称的可访问方法,该方法满足提供的参数,则编译将通过该调用。如果不存在这样的方法,编译将失败。
考虑LinkedList
实现List
和Deque
。
【讨论】:
那么,你是在建议 b.X();会导致编译时错误吗? @QNZ9WTX9W9 如果该类型(或其超类型)包含该名称的可访问方法,该方法满足提供的参数,则编译将通过该调用。如果不存在这样的方法,编译将失败。 @QNZ9WTX9W9X()
在B
中声明,因此在B
类型的表达式上调用它很好,假设这里b
是B
类型。【参考方案2】:
问题一:对象'b'可以使用下面的语法调用接口
C
中指定的方法y
吗?b.x();
不可以。
b.y()
调用一个名为y
的方法。
现在我想您可以编写一些实现B
和C
的类,以便它的方法y()
的实现调用y()
。但是b.y()
调用总是以调用y()
方法开始。
问题2:对象'b'可以使用下面的语法调用接口
C
中指定的方法y
吗?b.y();
不可以。
b
的静态类型是B
,B
确实定义了一个名为y
的方法。这会给你一个编译错误,说B
中没有y()
方法。
问题 3:那么,您是否建议使用 b.x();会导致编译时错误吗?
没有。 b
有一个静态类型B
,B
定义了方法x()
。因此调用是有效的。
【讨论】:
谢谢@Stephen C。我已根据您的 cmets 编辑了问题。我也做了一个重要的改变。它适用于 b.y() 吗?以上是关于调用 b.y() 时,实现多个接口的类(如下所示)会导致错误吗?的主要内容,如果未能解决你的问题,请参考以下文章