这样声明一个集合有什么区别
public class CatHerder{
private List cats;
public CatHerder(){
this.cats = new ArrayList<Cat>();
}
}
//or
public class CatHerder{
private ArrayList cats;
public CatHerder(){
this.cats = new ArrayList();
}
}
//or
public class CatHerder{
private ArrayList<Cat> cats;
public CatHerder(){
this.cats = new ArrayList<Cat>();
}
}
您应该将其声明为List<Cat>
,并将其初始化为ArrayList<Cat>
。
List
是一个接口,并且ArrayList
是一个实现类。相对于接口而不是实现,几乎总是比较可取的。这样,如果您以后需要更改实现,则不会破坏使用该接口进行编码的使用者。
根据您实际使用列表的方式,您甚至可以使用不太具体的列表java.util.Collection
(List
扩展的接口)。
至于List<Cat>
(您可以将其读为“猫的清单”)vs
List
:这是Java的泛型,可以确保安全地编译时类型。简而言之,它使编译器确保List
仅包含Cat
对象。
public class CatHerder{
private final List<Cat> cats;
public CatHerder(){
this.cats = new ArrayList<Cat>();
}
}
为什么我可以初始化ArrayList,如下所示: 但在使用时出错:
我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。
问题内容: 这两个声明之间有什么区别? 宣言1: 宣言2: 问题答案: 这是通用的,您想在将实现细节返回给客户端时隐藏实现细节,以后可以将实现从透明地更改为。 在设计库等的情况下,此机制很有用,这些库可能会在某个时间点更改其实现详细信息,而对客户端的更改最少。 这是您始终需要返回的要求。在某些时候,如果您想将实现细节更改为,也应在客户端进行更改以代替。
这两种声明之间有什么区别? 宣言1: 宣言2:
问题内容: 众所周知,arraylist是init。应该是这样的 那么,为什么Java允许这些? 那么,如果它们是正确的,为什么不允许这些? 编译器消息是:ArrayList类型的方法add(int,capture#1-of?extended Object)不适用于参数(int) 更一般 我读到了这件事,但很高兴收到您的来信。谢谢 另一个有趣的地方是: 问题答案: 您不能为类型的引用分配,因为它允