0

以下は、ジェネリックスタックをシリアル化および逆シリアル化するための私のプログラムのスニペットです

public Stack<?> readAll(Path aPath){
    Stack<?> temp = new Stack<>();
    try(ObjectInputStream readStream = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(aPath)))) {
        temp = (Stack<?>) readStream.readObject();
    }catch(EOFException e) {
        e.printStackTrace();
        System.out.println("EOF");
    }catch(IOException | ClassNotFoundException e) {
        e.printStackTrace();
        System.exit(1);
    }
    return temp;
}

シリアル化方法

public void writeAll(Path aPath) {
    try(ObjectOutputStream writeStream = new ObjectOutputStream(new BufferedOutputStream(Files.newOutputStream(aPath)))) {
        writeStream.writeObject(this);
    }catch(IOException e) {
    e.printStackTrace();
    }
}  

データのシリアル化と逆シリアル化の方法

import java.nio.file.*;
public class StackTrial {
    public static void main(String[] args) {
        String[] names = {"A","B","C","D","E"};
        Stack<String> stringStack = new Stack<>(); //Stack that will be Serialized
        Stack<String> readStack = new Stack<>(); //Stack in which data will be read
        Path aPath = Paths.get("C:/Documents and Settings/USER/Beginning Java 7/Stack.txt");//Path of file

        for(String name : names) { //pushing data in
            stringStack.push(name);
        }

        for(String a : stringStack) { //displaying content
            System.out.println(a);
        }
        stringStack.writeAll(aPath); //Serialize
        readStack = (Stack<String>) readStack.readAll(aPath);//Deserialize

        for(String a : readStack) { //Display the data read
            System.out.println(a);
        }
    }
}  

質問: readAll()メソッドのreturnタイプは、柔軟性を提供するために実際に何かを行っているのでしょうか、それとも、それを私のロジックに変更しても問題ではありStack<T> ません。Stack<Integer>戻るとトラブルの原因になります

4

1 に答える 1

2

Stack<Integer>コンパイラが、読み取ったものが、、、、Stack<String>またはであるかどうかを確認することはできませんStack<Whatever>。したがって、最終的には、スタックに何があるかを知る必要があり、スタックのタイプを決定する必要があります残りはシンタックスシュガーです。

あなたがそれをそのように残し、あなたが読んでいることを知っているならStack<Integer>、あなたは書く必要があります

Stack<Integer> stack = (Stack<Integer>) readAll(path);

あなたがそれを次のように書くなら

public <T> Stack<T> readAll(Path aPath) {...}

コンパイラは変数の宣言から型を推測できるので、次のように書くことができます。

Stack<Integer> stack = readAll(path);

しかし、結局のところ、結果は同じです。スタックから整数を取得するときに、実際には。でない場合は、例外が発生しますStack<Integer>

于 2012-06-02T13:43:45.090 に答える