Configuración de Java de valor corto

114

Estoy escribiendo un pequeño código en J2ME. Tengo una clase con un método setTableId(Short tableId). Ahora, cuando intento escribir setTableId(100), da un error de tiempo de compilación. ¿Cómo puedo establecer el valor corto sin declarar otra variable corta?

Al establecer el Longvalor que puedo usar setLongValue(100L)y funciona. Entonces, ¿qué Lsignifica aquí y cuál es el Shortvalor del carácter ?

Gracias

Mubashar
fuente
Les solo un sufijo que se usa para indicar un longliteral.
missingfaktor

Respuestas:

174

En Java, los literales enteros son de tipo int por defecto. Para algunos otros tipos, puede agregar al literal como sufijo una letra que no distinga entre mayúsculas y minúsculas L, como D, Fpara especificar long, double o float, respectivamente. Tenga en cuenta que es una práctica común utilizar letras mayúsculas para una mejor legibilidad.

La especificación del lenguaje Java no proporciona el mismo azúcar sintáctico para bytes o tipos cortos. En su lugar, puede declararlo como tal mediante la conversión explícita:

byte foo = (byte)0;
short bar = (short)0;

En la setLongValue(100L)llamada al método, no es necesario que incluya el Lsufijo porque en este caso el literal int se amplía automáticamente a un long. Esto se denomina conversión primitiva de ampliación en la Especificación del lenguaje Java.

Lauri
fuente
16
También hay sufijos para otros tipos: ¡ d/ Dhace a doubley f/ Fhace flotar!
Joachim Sauer
6
Además: los literales que se ajustan al tamaño no necesitan ser emitidos: sus dos ejemplos también funcionan sin el formato.
Joachim Sauer
Tienes razón en ambos. Debería haber sido más claro que estoy hablando de literales enteros aquí, no de literales de punto flotante.
Lauri
4
@Joachim: No se requiere yeso solo para J5 +; Lamentablemente, J2ME todavía está en J4 (un J4 muy reducido).
Lawrence Dol
2
@JoachimSauer, ¿qué significa "encajar en la talla"? Lo digo porque yo sólo tenía que echar específicamente 0como (short)0para moverse por un possible lossy conversion from int to shorterror, a pesar de que 0 es un corto.
Ryvantage
34

No existe un byte o un literal corto. Necesitas lanzar a corto usando(short)100

er4z0r
fuente
9

Por lo general, puede convertir la variable en un short.

También puede tener problemas como este que pueden resultar confusos. Esto se debe a que el +operador los promueve aint

ingrese la descripción de la imagen aquí

Lanzar los elementos no ayudará:

ingrese la descripción de la imagen aquí

Necesitas lanzar la expresión:

ingrese la descripción de la imagen aquí

quemaduras mate
fuente
1
No olvide que hay una razón por la cual short + short = int. Si la suma de dos cortos es mayor que el valor corto máximo de la máquina, convertirlo en corto producirá resultados inesperados o lanzará una excepción, si es compatible con el lenguaje.
DGoiko
2
Con esa lógica, agregar dos entradas devolvería un largo;)
Matt Burns el
1
Y busco eso si mis sumas pueden superar Integer.MAX_VALUE. No estoy defendiendo la decisión de devolver int (que probablemente esté relacionado con la forma en que el HW realmente realiza las sumas), solo digo que la gente debería confirmar que el resultado realmente se completa en un corto antes de ponerlo allí. También me he encontrado con más errores que limitan la capacidad corta que que limitan int, probablemente debido al tamaño de los números involucrados. 2 pequeños bytes de reserva de Java para un límite corto realmente rápido
DGoiko
1
Leí mi comentario nuevamente y no dejé mi punto claro. La primera oración es confusa y no debería haber dicho eso y dejar el resto, parece que hay dos declaraciones relacionadas. La razón detrás de short + short es int se puede leer aquí: docs.oracle.com/javase/specs/ jvms / se8 / html /… , no hay operaciones de suma abreviadas en JVM. El int de Java es de 32 bits, y cuando se tomaron estas decisiones, la mayoría de las computadoras eran de 32 bits, por lo que int parecía la mejor idea, supongo.
DGoiko
1
También tenga en cuenta que, como se explica aquí stackoverflow.com/a/27123302/9465588 , JVM en realidad sirvió al menos 32 bits de su espacio de memoria virtual por campo de clase, por lo que declarar campos cortos no ahorra memoria en absoluto. No sé si Java cambió esto. Tiendo a nunca usar valores cortos a menos que haya una restricción externa involucrada, como en un DAO
DGoiko
8

Puede utilizar setTableId((short)100). Creo que esto se cambió en Java 5 para que los literales numéricos asignados a bytes o cortos y dentro del rango para el objetivo se asuma automáticamente como el tipo de objetivo. Sin embargo, las últimas JVM J2ME se derivan de Java 4.

Lawrence Dol
fuente
PD: Bienvenido al atrapado en el dolor de la edad media de codificar para J2ME. No puedo esperar a que los dispositivos de mano alcancen las computadoras de escritorio del año 2000.
Lawrence Dol
3
No hay "J4" (ni "J5". Por favor, no haga que el esquema de nombres / versiones de Java sea más confuso de lo que ya es.
Joachim Sauer
2
@Joachim: Java 1, Java 2, Java 5, Java 6 y Java 7 son bien conocidos y se denominan así; no es demasiado difícil extrapolar lo que significaría Java 3 y Java 4. "Jn" es simplemente una abreviatura de lo obvio. La adopción de la nomenclatura actual (y con suerte final) de Sun para todas las versiones reduce la confusión.
Lawrence Dol
2
@Joachim: Según las últimas palabras de Sun sobre el tema, el "1" principal de Java "1.x" debe tratarse como si nunca estuviera allí cuando se hace referencia a las versiones en discusión, y se retiene en la versión emitida por las JVM solo por compatibilidad. Por lo tanto, Java 2 es la versión que antes se conocía como 1.2, de donde vino originalmente J2SE (notará que al mismo tiempo Sun recomendó no usar más J2xE, sino JavaEE, JavaSE y JavaME). De ello se desprende que 1.3 es Java 3, 1.4 es Java 4, 1.5 es Java 5, 1.6 es Java 6 y 1.7 es Java 7. En serio, esto no es tan difícil de razonar.
Lawrence Dol
2
El "1" fue solamente cortar de en Java 5 y ss. Sun siempre se refiere a Java 1.0-1.4 con ese nombre. Y eso se hace intencionalmente, porque Sun usó "Java 2" para referirse a Java 1.2 hasta Java 1.5 / Java 5. Es muy confuso, pero inventar nuevos nombres que Sun nunca usó no lo hace más fácil.
Joachim Sauer