为什么我不能将 CustomType ArrayList 添加到 ArrayList of Object ArrayLists?



我有这样的Singleton类:

public class Singleton
private static Singleton instance;
private ArrayList<Release> releases;
private ArrayList<Place> places;
ArrayList<ArrayList<Object>> list = new ArrayList<ArrayList<Object>>(2);
private Singleton() {
releases = new ArrayList<Release>();
places = new ArrayList<Place>();
list.add(release); //error, required AL<Object>, provided AL<Release> 
list.add(places); //same
}
public static Singleton getInstance(){
/* Singleton code */
}

我认为这是可能的,因为每个类都扩展Object类。我的意图是从AL保存为对象a的文件中读取,然后这些AL在一个AL的集合中,其中AL.get(PLACES_INDEX(将返回位置等等。这是一个很好的方法,还是我遗漏了什么?

稍后,我想有一些统一的方法,比如:

public ArrayList<T> getArrayList() {
/*return places or releases based on <T>*/
}

我不知道这是否可能,因为这个班是辛格尔顿。

我将解释为什么会出现错误,但从您的描述来看,这对您的类来说是一个糟糕的设计:不要存储"通用的";列表中的列表,以便根据某个索引访问它们。不要创建像public ArrayList<T> getArrayList() {这样的方法,该方法根据类型T返回其中一个列表。这是一种过度设计,使您的代码更难维护,也更容易破坏。

只需单独保存不同的列表,并为每个列表提供getter。如果您正在读取文件并希望将内容反序列化为数据结构,只需创建一个对内容建模的类结构即可。您的代码将更加简单易读。

尽管ReleaseObject的一个子类,但ArrayList<Release>而不是ArrayList<Object>的子类,因此不能将ArrayList<Release>添加到ArrayList<ArrayList<Object>>中(我们说泛型不是协变的(。如果Java允许您这样做,那么您最终可能会出现一个破坏代码通用性的场景:

ArrayList<ArrayList<Object>> list = new ArrayList<>();
ArrayList<Release> releases = new ArrayList<>();
list.add(releases);   // imagine this is allowed
ArrayList<Object> releasesFromList = list.get(0);
releasesFromList.add(place); // oops, added a place to list of release

最新更新