【问题标题】:How to read two different List types from a binary file如何从二进制文件中读取两种不同的列表类型
【发布时间】:2012-09-14 02:18:30
【问题描述】:

我正在尝试从二进制文件中读取两个不同的列表。一个列表是 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;
    }
}

【问题讨论】:

    标签: java list file-io


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2021-08-12
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        相关资源
        最近更新 更多