0

バイナリファイルから2つの異なるリストを読み取ろうとしています。1つのリストはFlightタイプで、もう1つはCustomerタイプです。instanceof演算子を使用しようとしましたが、パラメーター化された型リストに対してinstanceofチェックを実行できないため、コンパイラーにエラーが表示され ます。実行時にさらにジェネリック型の情報が消去されるため、代わりにフォームリストを使用してください。 すべてのリストが読み取られるまでアイテムをループを使用して読み取る必要があるため、このロジックを実装する方法がわかりません。私のコードは次のとおりです。

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()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

于 2012-09-14T04:03:45.267 に答える
2

が「 ____oのリスト」であるかどうかは確認できませ。ただし、の要素が__であるかどうかを確認oできます。または、明示的にマークすることもできます。

しかし、これは型消去の通常の結果です。ジェネリックはコンパイル時のアノテーションにすぎません。あなたのプログラムは実行時にジェネリックを保持しません!

于 2012-09-14T02:26:56.063 に答える