Domanda

Voglio scrivere un metodo che legge un oggetto da un file binario, ma voglio generalizzare usando farmaci generici.

ho questo codice:

@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;

}

Quando eseguo io ottenere un ClassCastException. Io non so nulla di modelli in java in modo che qualsiasi informazione sarà apprezzato. Ho letto qualcosa legato alla cancellazione, in fase di compilazione e l'esecuzione in tempo, ma non capisco molto bene perché ho questo ClassCastException.

Grazie.

EDIT: io chiamo il metodo come questo: FileUtils.readFromBinaryFile (filename); (senza "")

È stato utile?

Soluzione

Si sta chiamando il metodo sbagliato. Basta fare in questo modo:

FileUtils.readFromBinaryFile (filename); 

Cosa si sta chiamando è il cosiddetto metodo generico.

"Noi non abbiamo passare un argomento vero e proprio tipo di un metodo generico. Le deduce compilatore l'argomento tipo per noi, in base ai tipi di argomenti attuali. Sarà generalmente dedurre il più argomento di tipo specifico che renderà il tipo corretto di chiamata. " fonte

EDIT:

ho provato il vostro esempio e funziona (ho avuto in realtà commentare alcune linee)

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

Altri suggerimenti

Ci sono modelli in Java? Basta usare oggetti invece di T. In Java tutto deriva da Object alla base, in modo che non si vuole T obj ma Object obj.

A ClassCastException significa che il tipo di leggere non corrisponde al tipo che ti aspettavi (e cast a) vi consiglio di vedere quale oggetto che si vengono lette in un debugger (o un messaggio di log) e confrontarlo con quello che vi aspettate .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top