为什么Java中的许多Collection类扩展了Abstract类并实现了接口(也是由给定的抽象类实现的)?
例如,类HashSet扩展AbstractSet并实现Set,但AbstractSet已经实现Set.
实现以及扩展的java.util.ArrayList实现.但是在java文档中你可以看到AbstractList已经实现了List.那么实现List以及扩展AbstractList不是多余的吗?
我的第二个问题
请看下面的代码:ListAbstractList
String str = "1,2,3,4,5,6,7,8,9,10";
String[] stra = str.split(",");
List<String> a = Arrays.asList(stra);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:cannot convert form List<String> to ArrayList<String>
这背后的原因是什么?
EDIT
Arrays.asList()确实返回自己的ArrayList实现.看看这个.
可能重复:
为什么ArrayList有"实现列表"?
我是java新手我试图看到集合界面的层次结构.我发现AbstractList.java的签名 就像
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
Run Code Online (Sandbox Code Playgroud)
它实现了List接口.但是,如果你看看子类ArrayList.java的签名,它看起来像
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
如果你看父类已经实现了List接口那么为什么子类再次实现相同的接口(List).
这背后是否有具体的原因或要求
我在很多地方甚至在Java核心本身看到,尽管在父类中实现了一个接口,但子类明确地实现了相同的接口.
作为一个例子,这是一个AbstractSet实现Set 的定义
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
Run Code Online (Sandbox Code Playgroud)
和HashSet扩展AbstractSet.
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
我们为什么要再次明确实施Set?再次LinkedHashSet延伸相同的模式HashSet.
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
LinkedHashSet延伸Hashset,
HashSet农具Set<E>,Cloneable,java.io.Serializable
LinkedHashSet隐式实现所有接口,其父级扩展.那么为什么呢?我试图搞清楚,但我找不到背后的原因.即使是为了可读性,为什么不明确地实现Collection?
如果删除这个不必要的implements关键字,它的可读性更强 有谁知道这背后的原因?
我在SOF上看到了一些关于这个的问题,但我不相信这是为了更好的可读性,如果这也是为什么不实现Collection接口呢?
假设我有以下代码......
interface A{
void a();
}
interface B extends A{
void b();
}
class ImplementOne implements B{
public void a(){};
public void b(){};
}
class ImplementTwo implements B, A{
public void a(){};
public void b(){};
}
Run Code Online (Sandbox Code Playgroud)
无论类ImplementTwo是实现B和A,还是只实现B,它仍然需要在接口A中实现方法a(),因为接口B扩展了接口A.是否有任何理由明确地做
...implements B, A
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
...implements B
Run Code Online (Sandbox Code Playgroud)
?
可以实现接口并扩展实现相同接口的类会导致任何问题吗?(混淆除外)
例如:
interface IDo
public abstract class DoIt implements IDo
public class IllDo extends DoIt implements IDo
Run Code Online (Sandbox Code Playgroud)
(请忽略它似乎错了)
我知道在 Java 中大多数人使用以下方式声明列表:
List l = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
但这和之间有什么区别
AbstractList l = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
在这个特定实例中,使用接口相对于抽象类有哪些优点?