Pregunta

Quiero escribir un método que lee un objeto desde un archivo binario pero quiero generalizar el uso de los genéricos.

Tengo este código:

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

}

Cuando ejecuto me sale un ClassCastException. No sé nada acerca de las plantillas en Java por lo que será apreciada cualquier información. He leído algo relacionado con el borrado, en tiempo de compilación y en tiempo de ejecución, pero no entiendo muy bien por qué me sale este ClassCastException.

Gracias.

EDIT: Me llamo el método como este: FileUtils.readFromBinaryFile (filename); (sin "")

¿Fue útil?

Solución

Usted está llamando a su método equivocado. Sólo hacerlo de esta manera:

FileUtils.readFromBinaryFile (filename); 

Lo que está llamando es llamado método genérico.

"No tienen que pasar un argumento de tipo real a un método genérico. Los infiere compilador el argumento de tipo para nosotros, en base a los tipos de los argumentos reales. Será generalmente inferir el argumento más tipo específico que hará que el tipo correcto de llamadas. " fuente

EDIT:

He intentado su ejemplo y funciona (tuve realidad comentar algunas líneas)

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

Otros consejos

¿Hay plantillas en Java? Sólo tiene que utilizar objetos en lugar de T. En Java todo deriva del objeto en la base, por lo que no quiere T obj pero Object obj.

Un medio de ClassCastException del tipo que lee no coincide con el tipo que se esperaba (y fundido a) le sugiero que vea cuál es el objeto que se lee en un depurador (o un mensaje de registro) y compararlo con lo que se esperaba .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top