Pregunta Error en el compilador de eclipse o en javac ("no se pueden determinar los parámetros de tipo T")


El siguiente código

public class GenericsTest2 {

    public static void main(String[] args) throws Exception {
        Integer i = readObject(args[0]);
        System.out.println(i);
    }

    public static <T> T readObject(String file) throws Exception {
        return readObject(new ObjectInputStream(new FileInputStream(file)));
        // closing the stream in finally removed to get a small example
    }

    @SuppressWarnings("unchecked")
    public static <T> T readObject(ObjectInputStream stream) throws Exception {
        return (T)stream.readObject();
    }
}

compila en eclipse, pero no con javac (no se pueden determinar los parámetros de tipo T, no existe una instancia máxima única para la variable de tipo T con los límites superiores T, java.lang.Object).

Cuando cambio readObject (archivo String) para

    @SuppressWarnings("unchecked")
    public static <T> T readObject(String file) throws Exception {
        return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
    }

compila en eclipse y con javac. ¿Quién está correcto, el compilador de eclipse o javac?


74
2017-11-24 15:59


origen


Respuestas:


Yo diría que es el error en el compilador de Sun informó aquí y aquí, porque si cambias tu línea a la siguiente, funciona con ambas, lo que parece ser exactamente lo que se describe en los informes de errores.

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));

66
2017-12-02 23:39



En este caso, diría que su código es incorrecto (y el compilador de Sun está en lo cierto). No hay nada en sus argumentos de entrada para readObject inferir realmente el tipo T. En ese caso, es mejor dejar que devuelva Object y dejar que los clientes seleccionen manualmente el tipo de resultado.

Esto debería funcionar (aunque no lo he probado):

public static <T> T readObject(String file) throws Exception {
    return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}

13
2017-11-24 16:48



Oracle JDK6 u22 debería ser correcto, pero también tengo este problema con JDK6 u24

Este es un error de eclipse error 98379.

Esto no se corrigió pero el problema se resuelve mediante una solución como ejemplo en errores de eclipse (ver enlace)


3
2018-03-29 12:45



Encontré este problema en la versión de Java "1.6.0_22". Desapareció cuando actualicé a la versión de Java "1.6.0_32", ya que se corrigió en la actualización 25.


1
2018-03-11 11:33



Si puede modificar su método readObject para que funcione de manera transparente cuando se le llame, también puede usar lo siguiente:

public static <T> T readObject(String file, Class<T> type) throws Exception {
    return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}

De esta forma, la persona que llama se ve obligada a especificar el tipo de resultado y el compilador sabe cómo emitir el resultado.


0
2018-04-03 12:51