2011-03-23 27 views
8

Encontré un error extraño, que creo que es un error. Aquí es un caso mínimo, por favor no comentar sobre la utilidad del código :)javac extraña sintaxis - error inicio ilegal de la expresión

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.<Void>bar() > 42 ? 41 : 43 
     ) 
     ; 
    } 
} 

Resultado:

err.java:7: illegal start of expression 
     Foo.<Void>bar() > 42 ? 41 : 43 
      ^

He tratado SUN SDK javac 1.6.0_13 y 1.6.0_21.
El error desaparece, cuando sea

  • maquillaje bar() no genérico (sólo para la curiosidad, no es realmente una opción)
  • eliminar los paréntesis alrededor de la expresión ternaria en la línea 7

Parece que si e es una expresión, no siempre es válido escribir (e)?

Respuesta

5

El código compila publicado (y funciona) bien para mí usando Eclipse, pero puedo confirmar que javac no puede compilar esto. Sospecho que has encontrado un error de compilación en javac.

Probablemente sería una buena idea report it.

+0

Gracias Joachim. Eso es lo que temía (estoy atrapado con SDK estándar javac 1.6 en este momento). Tendrá que buscar la base de datos de errores en Sun/Oracle para averiguar si está solucionado. – Ingo

+1

El error ya tiene unos 3 años, pero aparentemente no se solucionará en jdk 1.6. Sin embargo, se corrigió en jdk 1.7 beta 14 (la vista previa del desarrollador es b189, por lo que se corrigió allí).) – Ingo

+0

@Ingo: ¿desea añadir un enlace al error que encontró? –

-3

es el valor de retorno, que no tiene que especificar esta llamando a un método estático:

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.bar() > 42 ? 41 : 43  
     ) 
     ; 
    } 
} 
+0

Declarando '' no ** especifica ** el valor de retorno, ¡especifica el argumento de tipo aquí! –

+0

Como traté de explicar, este código es puramente para demostración. Créanme, en el programa real, el argumento del tipo es indispensable. – Ingo

1

Logré compilarlo con un pequeño cambio en el código. Entonces, supongo que tiene que ver con la especificación del operador condicional (que es un poco complejo) o un error. Pero este problema ocurre solo en el operador condicional.

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      ((int)Foo.<Void>bar()) > 42 ? 41 : 43 
     ); 
    } 
} 
+0

¡Genial! Parece que el compilador está confundido y piensa que "(Foo) debe comenzar un molde? – Ingo

+0

@Ingo: Tiene usted razón, pero la pauta general es' No use el operador condicional con tipos de datos mixtos (simplemente porque la especificación es un poco compleja) '.pero no estás usando el tipo mixto en este caso. –

1

El error ya tiene unos 3 años de antigüedad, pero aparentemente no se solucionará en jdk 1.6. Sin embargo, está arreglado en jdk 1.7 beta 14 (la vista previa del desarrollador es b185, por lo que está arreglado allí, lo he intentado).

Cuestiones relacionadas