Frage

Ich möchte ein Verfahren schreiben, die ein Objekt aus einer Binärdatei liest, aber ich mag es verallgemeinern die Verwendung von Generika.

Ich habe diesen Code:

@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile (String filename){
T obj = null;

if (FileUtils.existsFile (filename)){
    ObjectInputStream ois = null;
    try{
        ois = new ObjectInputStream (new FileInputStream (filename));
        obj = (T)ois.readObject ();
    }catch (IOException e){
        Debug.out (e);
    }catch (ClassNotFoundException e){
        Debug.out (e);
    }finally{
        try{
            if (ois != null) ois.close();
        }catch (IOException e){
            Debug.out (e);
        }
    }
}

return obj;

}

Wenn ich es ausführen ich einen Classcast bekommen. Ich weiß nichts über Vorlagen in Java so werden alle Informationen apreciated. Ich habe etwas im Zusammenhang mit Lösch lesen, Übersetzungszeit und Ausführungszeit, aber ich verstehe nicht sehr gut, warum ich diese Classcast erhalten.

Danke.

EDIT: ich die Methode wie folgt aufrufen: FileUtils.readFromBinaryFile (filename); (ohne "")

War es hilfreich?

Lösung

Sie rufen Ihre Methode falsch. Tun Sie es einfach so:

FileUtils.readFromBinaryFile (filename); 

Was Sie fordern ist die so genannte generische Methode.

"Wir müssen keine tatsächliche Typ Argument übergeben an eine generische Methode. Der Compiler folgert die Art Argument für uns, basierend auf den Typen der tatsächlichen Argumente. Es wird in der Regel die meisten spezifischen Typ Argument schließen das wird den Anruftyp zu korrigieren machen. " Quelle

EDIT:

Ich habe Ihr Beispiel ausprobiert und es funktioniert (ich hatte tatsächlich ein paar Zeilen Kommentar)

    private static String filename = "number.serialized";

    public static void main(String[] args) {
        Double d = 3.14;
        writeToBinary(d, filename);
        Double readD = readFromBinaryFile(filename);
        System.out.println(readD);
    }

    @SuppressWarnings ("unchecked")
    public static <T> T readFromBinaryFile(String filename) {
        T obj = null;
        File file = new File(filename);
        if (file.exists()) {
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(new FileInputStream(filename));
                obj = (T)ois.readObject();
            } catch (IOException e) {
            } catch (ClassNotFoundException e) {
            } finally {
                try {
                    if (ois != null)
                        ois.close();
                } catch (IOException e) {
                }
            }
        }
        return obj;
    }

    public static <T> void writeToBinary(T obj, String filename) 
    {
        try {
            FileOutputStream fis = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(fis);
            oos.writeObject(obj);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

Andere Tipps

Gibt es Vorlagen in Java? Verwenden Sie einfach Objekt anstelle von T. In Java alles stammt von Objekt an der Basis, so dass Sie nicht T wollen obj aber Object obj.

A Classcast bedeutet, dass der Typ, den Sie nicht den Typ gelesen haben, um Ihr Ergebnis erwartet hatten (und cast) Ich schlage vor, Sie sehen, welches Objekt Sie in einem Debugger gelesen (oder eine Log-Nachricht) und vergleichen Sie es mit dem, was Sie erwarten .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top