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

Java 如何从二进制文件中读取两种不同的列表类型,java,list,file-io,Java,List,File Io,我试图从一个二进制文件中读取两个不同的列表。一个列表类型为航班,另一个类型为客户。我试图使用instanceof运算符,但编译器显示错误为 无法对参数化类型列表执行instanceof check。改用表单列表,因为更多的泛型类型信息将在运行时被删除。 由于在读取所有列表之前必须使用循环读取项目,因此我不确定如何实现此逻辑。 我的代码如下: public static void readFromFile() throws Exception { List<Flight> fl

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

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;
    }
}
public static void readFromFile()引发异常{
列表飞行列表;
列出客户名单;
//创建新的输入流对象
objInStream=newobjectinputstream(newfileinputstream(fileLocation));
//检查文件是否存在
如果(!fileLocation.exists()){
//创建新文件
fileLocation.createNewFile();
}
对象o;
而((o=objInStream.readObject())!=null){
//编译器显示错误
if(o instanceof List)
flightList=(List)o;
else if(o instanceof List)
customerList=o;
}
}

您无法检查
o
是否是一个“列表”\uuuuuuuuuuuuuuu。但是,您可以检查
o
的元素是否是。或者你可以直接标记它


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

您无法检查
o
是否是一个“列表”\uuuuuuuuu。但是,您可以检查
o
的元素是否是。或者你可以直接标记它


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

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

公共类泛型{
公共T m1(T对象){
返回对象;
}
公共空间m2(){
列表=新的ArrayList();
增加第(1)款;
}
}
反编译:m1()是泛型类型,可以从类文件中获取。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
publicm1(T);
旗帜:ACC_PUBLIC
代码:
堆栈=1,局部变量=2,参数大小=2
0:aload_1
1:轮到你了
LineNumberTable:
第20行:0
签字:#15/(TT;)TT;
公共空间m2();
旗帜:ACC_PUBLIC
代码:
堆栈=2,局部变量=2,参数大小=1
0:new#2//类java/util/ArrayList
3:dup
4:invokespecial#3//方法java/util/ArrayList。”“:()V
7:astore_1
8:aload_1
9:iconst_1
10:invokestatic#4//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13:invokeinterface#5,2//interface方法java/util/List.add:(Ljava/lang/Object;)Z
18:流行音乐
19:返回
LineNumberTable:
第24行:0
第25行:8
第26行:19


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

公共类泛型{
公共T m1(T对象){
返回对象;
}
公共空间m2(){
列表=新的ArrayList();
增加第(1)款;
}
}
反编译:m1()是泛型类型,可以从类文件中获取。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
publicm1(T);
旗帜:ACC_PUBLIC
代码:
堆栈=1,局部变量=2,参数大小=2
0:aload_1
1:轮到你了
LineNumberTable:
第20行:0
签字:#15/(TT;)TT;
公共空间m2();
旗帜:ACC_PUBLIC
代码:
堆栈=2,局部变量=2,参数大小=1
0:new#2//类java/util/ArrayList
3:dup
4:invokespecial#3//方法java/util/ArrayList。”“:()V
7:astore_1
8:aload_1
9:iconst_1
10:invokestatic#4//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13:invokeinterface#5,2//interface方法java/util/List.add:(Ljava/lang/Object;)Z
18:流行音乐
19:返回
LineNumberTable:
第24行:0
第25行:8
第26行:19