如何从二进制文件中读取两种不同的List类型

时间:2012-09-14 02:18:30

标签: java list file-io

我试图从二进制文件中读取两个不同的列表。一个列表的类型为 Flight ,另一个列表的类型为 Customer 。我尝试使用 instanceof 运算符,但编译器显示错误为 无法对参数化类型List执行instanceof检查。请改用表单List,因为在运行时将删除更多泛型类型信息。 由于必须使用循环读取项目直到读取所有列表,我不确定如何实现此逻辑。 我的代码如下:

public static void readFromFile() throws Exception {
    List<Flight> flightList;
    List<Customer> customerList;

    //Create new input stream object
    objInStream = new ObjectInputStream(new FileInputStream(fileLocation));

    //Check if file exists
    if(!fileLocation.exists()) {
        //create new file
        fileLocation.createNewFile();
    }
    Object o;
    while((o = objInStream.readObject()) != null) {
        //Compiler shows error
        if(o instanceof List<Flight>) 
            flightList = (List<Flight>) o;
        else if(o instanceof List<Customer>)
            customerList = o;
    }
}

2 个答案:

答案 0 :(得分:3)

当你声明泛型类型时,你可以得到它。 当您使用泛型类型时,它将被删除。 例如:

public class Generics {
    public <T> T m1(T object){
        return object;
    }
    public void m2(){
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
    }
}

反编译:m1()deckare泛型类型,你可以从类文件中获取它。 m2()使用泛型类型,擦除。

public <T extends java/lang/Object> T m1(T);
flags: ACC_PUBLIC
Code:
  stack=1, locals=2, args_size=2
     0: aload_1
     1: areturn
  LineNumberTable:
    line 20: 0
Signature: #15                          // <T:Ljava/lang/Object;>(TT;)TT;

public void m2();
flags: ACC_PUBLIC
Code:
  stack=2, locals=2, args_size=1
     0: new           #2                  // class java/util/ArrayList
     3: dup
     4: invokespecial #3                  // Method java/util/ArrayList."<init>":()V
     7: astore_1
     8: aload_1
     9: iconst_1
    10: invokestatic  #4                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
    13: invokeinterface #5,  2            // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
    18: pop
    19: return
  LineNumberTable:
    line 24: 0
    line 25: 8
    line 26: 19

答案 1 :(得分:2)

您无法检查o是否为“ _ __ _ 的列表。”但是,您可以检查o的元素是否 _ _。或者你可以明确地标记它。

但这是类型擦除的正常结果。泛型只是编译时注释。您的程序不会在运行时保留泛型!