【问题标题】:Can any class that implements java.io.serializable be added to an array list of generic type <Serializable>是否可以将任何实现 java.io.serializable 的类添加到泛型类型 <Serializable> 的数组列表中
【发布时间】:2013-10-20 15:52:04
【问题描述】:

说明:

我有一个 ArrayList,它采用任何实现 Serializable 的类。我什至可以将实现 Serializable 的类的实例添加到此数组列表中,而不会出现任何编译错误。 Java 泛型如何处理将这些可序列化对象添加到此列表中?

我知道我们无法定义引用 List&lt;Object&gt; l

但是,我的 List&lt;Serializable&gt; serializables 参考没有发现任何编译问题。

我的第二个问题是如何在添加到此可序列化列表的这些对象中检索我的元素?

如果已经发布了类似问题的答案,请发布您的链接。

/***Here is my main class***/

import java.io.Serializable;
import java.util.*;

public class LearnArrayList {
    public static void main(String[] args) {

        List<Serializable> serializables = new ArrayList<Serializable>();
        serializables.add(new RandomClass1());
        serializables.add(new RandomClass2());

    }
}

/***Here is my RandomClass1 that I will add it to List<Serializable>***/

import java.io.Serializable;

public class RandomClass1 implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int a;
    private int b;

/*Getters and setters here*/
}

/***Here is my RandomClass2 that I will add it to List<Serializable>***/
import java.io.Serializable;

public class RandomClass2 implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String s;

/*Getters and setters here*/
}

【问题讨论】:

  • 是的,放你为什么不试试呢?它会比输入问题快 100 倍左右。
  • “我知道我们不能定义一个引用 List l” 解释一下。另外,我不明白你的第二个问题。
  • 我将把这个问题带回到这里。“我知道我们无法定义引用 List l”这一事实。编译器不会阻止我们定义对象列表。我们可以使用 .get(index) 检索这些对象。但是从我的列表中检索对象后,查看类中元素的正确方法是什么。
  • 我也为您的评论添加了答案。

标签: java collections serializable


【解决方案1】:

Java 泛型如何处理将这些可序列化对象添加到此列表?

编译器会检查您添加的内容是否为 Serializable。

我知道我们无法定义引用列表 l

其实可以的。

但是,我的 List serializables 参考没有发现任何编译问题。

我也不明白为什么会出现编译错误。

我的第二个问题是如何在添加到此可序列化列表的这些对象中检索我的元素?

与您列出任何列表的方式相同。使用 get(n) 或迭代它们。

但是,从我的列表中检索对象后,查看类中元素的正确方法是什么?

正确的方法是实现你的程序必须做的最简单、最清晰的方法。

【讨论】:

    【解决方案2】:

    请参考下面的代码sn-p。我希望这是不言自明的。

        public static void main(String[] args) {
        List<Serializable> serializables = new ArrayList<Serializable>();
        serializables.add(new RandomClass1());
        serializables.add(new RandomClass2());
        process(serializables);
        process2(serializables);//no issues
    
        List<RandomClass1> randomClassList = new ArrayList<RandomClass1>();
        randomClassList.add(new RandomClass1());
        randomClassList.add(new RandomClass1());
        process(randomClassList);
        process2(randomClassList);//compile time error in this line
    }
    
    
    private static void process(List<? extends Serializable> list){
        Iterator<? extends Serializable> itr = list.iterator();
        while (itr.hasNext()){
            Serializable s = itr.next();
            System.out.println("process1: " + s.getClass());
        }
    }    
    
    private static void process2(List<Serializable> list){
        Iterator<Serializable> itr = list.iterator();
        while (itr.hasNext()){
            Serializable s = itr.next();
            System.out.println("process2: " + s.getClass());
        }
    }
    

    输出是

    process1: RandomClass1

    process1: RandomClass2

    process2: RandomClass1

    process2: RandomClass2

    process1: RandomClass1

    process1: RandomClass1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 2019-03-25
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2023-03-29
      相关资源
      最近更新 更多