我试图从二进制文件中读取两个不同的列表。一个列表的类型为 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;
}
}
答案 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
的元素是否 _ _。或者你可以明确地标记它。
但这是类型擦除的正常结果。泛型只是编译时注释。您的程序不会在运行时保留泛型!