当前位置: 首页 > 面试题库 >

为什么arraylist类要实现List并扩展AbstractList?

澹台蕴藉
2023-03-14
问题内容

工具的java.util.ArrayList实现List以及扩展AbstractList。但是在Java文档中,您可以看到AbstractList已经实现了List。那么实现List以及扩展AbstractList是否不是多余的? 我的第二个问题,

请看下面的代码:

String str = "1,2,3,4,5,6,7,8,9,10";
String[] stra = str.split(",");
List<String> a = Arrays.asList(stra);

Arrays.asList()Arrays类的方法包含其自己的ArrayList实现。但这仅扩展AbstractList而未实现List。但是上面的代码可以编译。
但是将代码修改为以下内容时

String str = "1,2,3,4,5,6,7,8,9,10";
String[] stra = str.split(",");
java.util.ArrayList<String> a = Arrays.asList(stra);

我收到一个错误:cannot convert form List<String> to ArrayList<String>
这是什么原因?
EDIT
Arrays.asList()确实返回其自己的ArrayList实现。检查这个出来。


问题答案:

对于第一个问题,请看为什么ArrayList具有“实现列表”?

回答第二个问题

java.util.ArrayList<String> a = Arrays.asList(stra);

正如您提到的,Arrays.asList返回其自己的AbstractList
实现,不幸的是,此代码的创建者也将其命名为ArrayList类。现在,由于我们不能水平转换,而只能垂直返回数组列表,java.utli.ArrayList因此只能转换为java.util.AbstractList或它的超类型java.util.List,这就是第一个代码示例起作用的原因。



 类似资料:
  • 的实现实现了以及扩展了。但是在Java文档中,您可以看到AbstractList已经实现了List。那么在扩展AbstractList的同时实现List会不会是多余的呢? 我的第二个问题 请看一下下面的代码: Arrays类的方法包含自己的ArrayList实现。但是这个只扩展了AbstractList,而没有实现List。但是上面的代码编译。 但将代码修改为以下内容时 我得到一个错误: 这背后的

  • 问题内容: 今天打开了LinkedHashSet源代码,发现了一些有趣的东西: 问题是:为什么当HashSet已经是Set时,为什么它们既需要“ extends HashSet”又需要“ implements Set”? 问题答案: 我问过乔什·布洛赫(Josh Bloch),他告诉我这是一个错误。很久以前,他曾经认为其中有一些价值,但是他自从“看到了光”。显然,JDK维护人员认为以后不应该撤消此

  • 问题内容: 为什么必须始终在类声明之后编写?例如: 为什么不能这样: 后者会产生编译时错误。 问题答案: 当Java编译器将类转换为字节码时,它必须首先查找父类。这是因为类的基础实现是指向父类的字节码-包含相关的方法和字段。然后,它添加指向子类函数代码的指针-其中一些由’implements’关键字强制执行。 因为父类必须是可编译的,所以如果编译器预先知道该类是什么,则会更容易。此外,您只能扩展一

  • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

  • 我被这个概念困住了。 这是我在一个站点上看到的解释的一部分: 隐藏实现 我是这样想象的: 库客户机是否知道这个实现有什么区别?

  • 假设我有下面的代码... 不管类ImplementTwo是同时实现B和A,还是只实现B,它仍然需要在接口A中实现方法A(),因为接口B扩展了接口A。有什么理由显式地这样做吗 而不只是 ?