2012-07-31 6 views
6

No he visto esta pregunta exacta aquí, lo que me sorprende.¿Por qué no puedo lanzar un objeto dentro de una declaración if?

Lo siguiente no se compilará:

public int compareTo(Object o) 
{ 
    if (this.order < ((Category o).order)) 
    { 
     return -1; 
    } 
    else if (this.order > ((Category o).order)) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

mientras que cambiar esto a emitir el objeto y almacenar su referencia en un nuevo objeto fuera de la sentencia condicional corrige el problema:

Category cat = (Category)o; 
if (this.order < cat.order) 
// Etc... 

Mi pregunta es, ¿por qué no se permite este comportamiento en Java? (Java 5 específicamente)

EDITAR: ¡Ajá! Gracias a todos. Darn IDEs modernos dando mensajes de error vagos. Empecé a descontarlos, lo que no me sirvió de nada esta vez. (Netbeans me estaba advirtiendo sobre un paréntesis faltante y un punto y coma faltante ...)

+0

if (this.order <((Category) o) .order) – Joel

+0

There * is * a missing paréntesis. – EJP

+0

@EJP Correcto, pero no falta el punto y coma. Esa fue la evidencia de que debería haberle prestado atención, pero también de que esos mensajes pueden ser poco convincentes. – BlackVegetable

Respuesta

17

El problema aquí es que su sintaxis no es correcta. Debe ser

public int compareTo(Object o) 
{ 
    if (this.order < ((Category) o).order) 
    { 
     return -1; 
    } 
    else if (this.order > ((Category) o).order) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 
1

Esto se debe permitir, parece como si el paréntesis puede ser apagado: has algo así como

si (this.order < (((Categoría) o) .order))

1

creo que se necesita esto:

(((Category) o).order) 

que acaba de intentar una versión más simple de lo que tiene:

int a = 5; 
     if(4 < (double)a); 

y se compiló bien.

1

Hay una clara diferencia entre los dos fragmentos de código que envió:

(Category o) 

es diferente que:

(Category)o 

Esta primera no se compilará, la segunda voluntad.

1

Tenga una mirada en simples trabajando demo de fundición dentro if:

int i; 
float d = 10.5f; 
if((i = (int) d) == 10){ 
//works 
} 

en su problema de código es con if (this.order < ((Category o).order)) su incorrecta comunicado

Cabe if (this.order < ((Category) o).order)

EDITAR: Su problema resuelto, pero una cosa más (relleno adicional), sin necesidad de tener else (forma de escalera) que va a ser sometido return dentro if

public int compareTo(Object o) 
{ 
    if (this.order < ((Category) o).order) 
    { 
     return -1; 
    } 
    if (this.order > ((Category) o).order) 
    { 
     return 1; 
    } 
    return 0; 
} 
+0

@BlackVegetable una cosa más, no hay necesidad de tener 'else' ya que tiene' return' en 'if' –

3

prefiero la sintaxis

Category.class.cast(o) 

, entonces usted es explícito en lo que está haciendo y evita cualquier confusión entre corchetes. Desde mi entendimiento, lo anterior es lo mismo que ((Categoría) o)

+0

¡Ajá! ¿Alguien más puede verificar que esto sea correcto? ¡Realmente me gusta esta sintaxis! – BlackVegetable

+3

Bueno, definitivamente compilan hasta código diferente. Ambos incluyen un cheque, pero el método 'Category.class.cast (o)' también empuja 'Category.class' a la pila y luego tiene un' invokevirtual'. En otras palabras, el enfoque '.class' tiene todo lo que tiene el enfoque de reparto, más algunos. ¿Cuánto impacto en el rendimiento tendría esto? No lo sé (supongo que insignificante). http://pastebin.com/7VRtfX5j – yshavit

Cuestiones relacionadas