0

我正在尝试从二进制文件中读取两个不同的列表。一个列表是Flight类型,另一个是Customer类型。我尝试使用instanceof运算符,但编译器显示错误 无法针对参数化类型列表执行 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;
    }
}
4

2 回答 2

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() 甲板是泛型类型,你可以从类文件中得到它。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

于 2012-09-14T04:03:45.267 回答
2

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

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

于 2012-09-14T02:26:56.063 回答