【问题标题】:Why I can't add CustomType ArrayList to ArrayList of Object ArrayLists?为什么我不能将 CustomType ArrayList 添加到 Object ArrayLists 的 ArrayList 中?
【发布时间】:2021-06-11 05:09:59
【问题描述】:

我有这样的单例类:

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 保存为对象的文件中读取,然后这些 AL 在一个 AL 的集合中具有一个 AL,其中 al.get(PLACES_INDEX) 将返回位置等等。这是一个好方法还是我错过了什么?

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

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

我什至不知道这是否可能,因为这个类是单例的。

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    我将解释为什么您会收到错误,但从您的描述来看,这对您的班级来说似乎是一个糟糕的设计:不要将“通用”列表存储在列表中,以根据某个索引访问它们。并且不要创建像public ArrayList&lt;T&gt; getArrayList() { 这样的方法,它会根据T 的类型返回列表之一。这是过度工程,使您的代码更难维护,也很容易被破解。

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

    即使ReleaseObject 的子类,ArrayList&lt;Release&gt;不是ArrayList&lt;Object&gt; 的子类,因此您不能将ArrayList&lt;Release&gt; 添加到ArrayList&lt;ArrayList&lt;Object&gt;&gt;(我们说generics are not covariant)。如果 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
    

    【讨论】:

    • 哦,我明白了。我也有方法:readPlaces()readReleases()(至少有五个)读取这些对象的列表并将它们分配给 ArrayList&lt;Place&gt;ArrayList&lt;Release&gt; 列表。这些方法仅在两行中有所不同,即文件名和分配刚刚读取的arrayList 时。另一方面不是在重复自己吗?
    • @Flauslord 如果唯一的区别是文件名和要填充的列表,那么我想你可以创建一个方法(或一个帮助类,取决于你的复杂性)采用文件名和要填充的列表作为参数。它在这里与泛型无关,但是是的,它有助于避免重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2018-12-09
    • 2014-07-02
    • 2016-05-14
    • 2017-10-07
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多