Error en eclipse compilador o en javac («parámetros de tipo T no puede ser determinado»)

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 (parámetros de tipo T no puede ser determinado; no hay una única máxima instancia existe para la variable de tipo T con límites superior T,java.lang.Objeto).

Cuando me cambio readObject(String archivo) para

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

se compila en eclipse y con javac. Que es correcto, el eclipse o compilador javac?

5 Kommentare

  1. 66

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

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

    En este caso, yo diría que su código está mal (y el Sol compilador es la de la derecha). No hay nada en sus argumentos de entrada a readObject realmente inferir el tipo T. En ese caso, es mejor dejarlo Objeto de devolución, y permitir que los clientes manualmente echado el tipo de resultado.

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

    public static <T> T readObject(String file) throws Exception {
        return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
    }
    • volver GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(archivo))); hace el trabajo. Gracias!
    • No estoy de acuerdo, se parece más a la de bugs relacionados a continuación. El compilador debe confiar en una conversión explícita, sin inferencia de tipos – el siguiente compila multa @SuppressWarnings(«unchecked») public static <T> T createT(String nombre de la clase) throws Exception { return (T) de Clase.forName(className).newInstance(); }
  3. 3

    Oracle JDK6 u22 debe ser correcto, pero tengo este problema con el JDK6 u24 demasiado

    Este es un error de eclipse error 98379.

    Esto no fue corregido, pero el problema se resuelve a través de la solución como ejemplo en eclipse errores (ver enlace)

  4. 1

    He encontrado este problema en la versión de java «1.6.0_22». Desapareció cuando he actualizado a la versión de java «1.6.0_32», como fue solucionado en la actualización 25.

  5. 0

    Si usted puede modificar su método readObject para trabajar de forma transparente cuando se le llama, también puede utilizar las siguientes:

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

    Esta manera, la persona que llama está obligado a especificar el tipo de resultado y el compilador sabe cómo emitir el resultado.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea