可以将任何实现java.io.serializable的类添加到泛型类型<serializable> </serializable>的数组列表中

时间:2013-10-20 01:14:11

标签: java collections serializable

说明

我有一个ArrayList,它接受任何实现Serializable的类。我甚至能够将实现Serializable的类的实例添加到此数组列表中,而不会出现任何编译错误。 Java Generics如何处理将这些可序列化对象添加到此List?

我知道我们无法定义引用List<Object> l

但是我的List<Serializable> 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*/
}

2 个答案:

答案 0 :(得分:4)

  

Java Generics如何处理将这些可序列化对象添加到此List?

编译器检查您添加的是Serializable。

  

我知道我们无法定义引用List l

其实你可以。

  

但是我没有看到我的List serializables引用有任何编译问题。

我不明白你为什么会遇到编译错误。

  

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

与任何列表相同。使用get(n)或迭代它们。

  

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

正确的方法是实现程序必须执行的最简单,最清晰的方法。

答案 1 :(得分:0)

请参阅以下代码段。我希望这是自我解释的。

    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