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

类在什么条件下实现接口?

严俊彦
2023-03-14

这句话刚从我脑海中浮现出来:

Queue<T> q = new LinkedList<T>();

我知道Queue是一个接口,LinkedList类“实现”Queue拥有的所有方法(addremovepeek等)。

然而,我查看了LinkedList(openjdk6)的源代码,却发现该类没有显式实现队列接口。

public class LinkedList<E>
   extends AbstractSequentialList<E>
   implements List<E>, Deque<E>, Cloneable, java.io.Serializable

然后我阅读了Deque的源代码

此外,如果我有一个类,该类实现了接口中的所有方法,我可以在不使用“implements”关键字的情况下使用接口类型分配该类的对象吗?


共有3个答案

乌和畅
2023-03-14

它实现了扩展队列的Deque

这意味着所有Queue方法和所有Deque方法都已实现

http://www.docjar.com/html/api/java/util/LinkedList.java.html

第一个是的

回答第二个问题,您必须“声明”您正在实现该接口

巩才捷
2023-03-14

然后我阅读了Deque的源代码,看到Deque接口扩展了队列接口。这是否意味着通过实现Deque,LinkedList也实现了Queue及其所有祖先?

只要实现类确实是一个具体的类,而不是一个抽象的类

另外,如果我有一个类,它实现了接口中的所有方法,我可以用接口类型分配该类的对象吗?

不是。你所指的有时被称为鸭子打字。Java不直接支持这一点。如果通过在相应类的层次结构中的某处使用implements关键字显式声明要实现接口,则只能将此类的对象分配给接口类型。

*:正如评论中指出的那样:语言本身不支持Duck类型。有一些反射黑客允许某些构造,这些构造类似于在真正允许Duck类型的语言中可以实现的构造。

马嘉勋
2023-03-14

是的,继承是可传递的,有接口和子类。一、 e.如果B扩展了A,C实现了B,那么C实现了A。

不,你描述的是“鸭子打字”。

在使用面向对象编程语言的计算机编程中,duck类型是一种类型类型,在这种类型中,对象的方法和属性决定有效语义,而不是从特定类继承或显式接口的实现。

这意味着,如果它走路像鸭子,嘎嘎叫像鸭子,那么它一定是鸭子。然而,在Java中,不支持duck类型。类必须显式实现接口或扩展类,才能分配给该接口类型或超类类型。

 类似资料:
  • 7.3. 实现接口的条件 一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。例如,*os.File类型实现了io.Reader,Writer,Closer,和ReadWriter接口。*bytes.Buffer实现了Reader,Writer,和ReadWriter这些接口,但是它没有实现Closer接口因为它不具有Close方法。Go的程序员经常会简要的把一个具体的类型描述成

  • 问题内容: @Entity public class Husband implements Serializable { 广义上是什么? 类为什么实现接口? 为什么丈夫成员一个人只有@OnetoOne(mappedBy =“ Wife”),而妻子成员却没有@OnetoOne(mappedBy =“ husband”) 问题答案: 广义上讲,序列化是Java为开发人员提供的将任何对象的状态持久保存到

  • 什么类实际实现了接口?我正在研究收集API。。而且似乎在实现类中返回的实际方法是直接在本身中指定的。 接口指定用于操作迭代器的实际方法。。但是我很难找到实现这个的实际类。 哪个类实际上-实现-接口,允许类中的方法工作? 我确信必须有一个实现类,因为调用本身肯定不能返回接口,必须有实例化的东西。

  • 问题内容: 什么时候/ 创建a的条件是什么? 是每个域吗?例如,如果我有一个Tomcat应用程序服务器,并且部署了多个Web应用程序,是否会为每个上下文(Web应用程序)创建一个不同的应用程序,或者只要它们是同一域,它是否会在Web应用程序之间共享? 问题答案: 创建会话时,将创建/发送。会话是在你的代码调用或第一次调用时创建的。如果你只想获取会话,但如果不存在则不创建会话,请使用-这将返回一个会

  • 在一个个人项目中,我遇到了一个TypeScript条件类型的问题。我对TypeScript文档中的条件类型有基本的了解。我希望下面的设置工作,但它给出了一个类型错误。 基本上,我试图为从磁盘加载的树节点定义一个接口。这意味着,由于缺少文件等原因,某些节点可能无法正确加载。因此,任何节点实现都可能包含或。 我希望方法的实现可以返回,因为接口是通过类型扩展

  • 我正在学习一本书,即“.NET域驱动的C#设计”。 问题基于如下类图所示的场景: 图:http://screencast.com/t/a9uuljvw0 现在,如果我用ICompanyRepository变量comrep调用Add()函数... 然后调用RepositoryBase类(它是CompanyRepository的父类)中的Add()函数。 我的问题是:在(抽象基)类“repositor