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