2012-06-16 10 views
5

estoy tratando de entender el código siguiente:Problemas con parámetros de colada y cortas en Java

public class A { 
    private void doTask() {  
     doInt(99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 

El código da un error de compilación en la línea "doInt (99)".

The method doInt(short) in the type A is not applicable for the arguments (int) 

Puede alguien explicar por qué me está dando el error.

+0

posible duplicado http://stackoverflow.com/q/5106766/269514, http://stackoverflow.com/q/2294934/269514 – Gilberto

+0

Más reciente pregunta duplicado http://stackoverflow.com/q/ 16505959/269514 – Gilberto

Respuesta

4

Trate

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 

Java piensa que todos los literales (como 99 ó 100) en su programa es int.

Si pasa el número grande, 12345678 por ejemplo, se cortará para que se ajuste al valor short. Java no puede cortar el número sin ti, por lo que debes hacerlo tú mismo. De esta forma, puede ver que está lanzando int para abreviar

+0

No es necesario lanzar 100 a corto. Cuando asigna un literal numérico a un cortocircuito y cuando su valor está dentro del rango legal, se supone que el literal es corto. – Xion345

+0

Sí, pero pensé en la versión anterior de java que necesita hacer esto – alaster

7

En java, el tipo predeterminado de un número entero es int. Java se actualizará automáticamente (por ejemplo, desde short hasta int), pero emitirá una advertencia con downcasting (por ejemplo, desde int hasta short) debido a la posible pérdida de datos.

La solución a su código es la siguiente:

doInt((short)99); 

Este abatido explícita cambia el 99 (que es un int) a un short, así que no hay (más) posible pérdida de datos.

+0

muchas gracias. No estoy viendo una advertencia. En realidad, da un error de compilación. – Alan2

1

Necesita lanzar 99 a un corto. Por favor, intente lo siguiente tipo de datos

public class A { 
    private void doTask() {  
     doInt((short) 99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 
1

int es generalmente la opción por defecto a menos que haya una razón.

Y por lo tanto 99 se trata como int.

leer más detalles sobre Primitive Data Types

Es necesario conversión explícita cuando sea necesario.
Cambie doInt(99) a doInt((short) 99) y debería estar funcionando.

1

La principal causa de error es

No se puede convertir implícitamente tipos numéricos no literales de mayor capacidad de almacenamiento a corto

Así que cambiar su código a continuación.

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 
+1

abreviado ans = 10; no me da un error – Alan2