Question

Je veux écrire une méthode qui lit un objet à partir d'un fichier binaire, mais je veux généraliser l'utilisation des médicaments génériques.

J'ai ce 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;

}

Quand je l'exécute, je reçois un ClassCastException. Je ne sais pas quoi que ce soit sur les modèles en java de sorte que toute information sera aprécié. J'ai lu quelque chose lié à l'effacement, la compilation et l'exécution en temps mais je ne comprends pas très bien pourquoi je reçois ce ClassCastException.

Merci.

EDIT: J'appelle la méthode comme ceci: FileUtils.readFromBinaryFile (filename); (sans "")

Était-ce utile?

La solution

Vous appelez votre mauvaise méthode. Il suffit de le faire de cette façon:

FileUtils.readFromBinaryFile (filename); 

Qu'est-ce que vous appelez est soi-disant méthode générique.

"Nous n'avons pas passer un argument de type réel à une méthode générique. Le compilateur infère l'argument de type pour nous, sur la base des types des arguments réels. Il déduira généralement le plus argument de type spécifique qui fera le type correct appel. " source

EDIT:

J'ai essayé votre exemple et cela fonctionne (je l'avais fait des commentaires des lignes)

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

Autres conseils

Y at-il des modèles en Java? Il suffit d'utiliser l'objet au lieu de T. Dans Java tout découle de l'objet à la base, de sorte que vous ne voulez pas Tobj mais Object obj.

A ClassCastException signifie le type que vous lisez ne correspond pas au type que vous attendiez (et casting à) Je vous suggère de voir quel objet vous lisez dans un débogueur (ou un message de journal) et le comparer avec ce que vous attendez .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top