Kısa Değer Java'yı Ayarlama


114

J2ME'de küçük bir kod yazıyorum. Metotlu bir sınıfım var setTableId(Short tableId). Şimdi yazmaya çalıştığımda setTableId(100)derleme zamanı hatası veriyor. Başka bir kısa değişken bildirmeden kısa değeri nasıl ayarlayabilirim?

LongDeğeri ayarlarken kullanabilirim setLongValue(100L)ve işe yarıyor. Öyleyse, Lburada ne anlama geliyor ve Shortdeğerin karakteri nedir?

Teşekkürler


Lyalnızca longbirebir belirtmek için kullanılan bir sonektir.
missingfaktor

Yanıtlar:


174

Java'da, tamsayı değişmezleri varsayılan olarak int türündedir. Diğer bazı türleri için böyle bir harf duyarsız harfi ile edebi soneki olabilir L, D, Fsırasıyla uzun, çift veya şamandıra belirtmek için. Daha iyi okunabilirlik için büyük harflerin kullanılmasının yaygın bir uygulama olduğunu unutmayın.

Java Dil Belirtimi, bayt veya kısa türler için aynı sözdizimsel şekeri sağlamaz. Bunun yerine, bunu açık çevrim kullanarak ilan edebilirsiniz:

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

Sizin de setLongValue(100L)bir yöntem çağrısı, eklemek mutlaka gerekmez Lbu durumda int değişmezi otomatik uzun bir genişledi çünkü eki. Buna Java Dil Belirtiminde genişleyen ilkel dönüştürme denir.


16
Diğer türler için de son ekler vardır: d/ Dyapar doubleve f/ Fkayar!
Joachim Sauer

6
Ayrıca: boyuta uyan değişmez değerlerin dönüştürülmesi gerekmez: iki örneğiniz de cast olmadan çalışır.
Joachim Sauer

İkisinde de haklısın. Burada tamsayı değişmezlerinden bahsettiğim konusunda daha net olmalıydım, kayan noktalı değişmezlerden değil.
Lauri

4
@Joachim: Yalnızca J5 + için cast gerekmez; J2ME maalesef hala J4'te (ciddi şekilde soyulmuş bir J4).
Lawrence Dol

2
@JoachimSauer, "bedene sığdırmak" ne anlama geliyor? Sadece özel olarak dökme zorundaydı Soruyorum 0olarak (short)0bir çevrede almak possible lossy conversion from int to short0 kısa olsa bile, hata.
ryvantage

34

Bayt veya kısa literal diye bir şey yoktur. Kullanarak kısaya çevirmeniz gerekiyor(short)100


9

Genellikle, değişkeni bir short.

Bunun gibi kafa karıştırıcı problemler de yaşayabilirsiniz. Bunun nedeni, +operatörün bunları birint

görüntü açıklamasını buraya girin

Elemanları yayınlamak yardımcı olmaz:

görüntü açıklamasını buraya girin

İfadeyi atmanız gerekiyor:

görüntü açıklamasını buraya girin


1
Kısa + kısa = int'in bir nedeni olduğunu unutmayın. İki şortun toplamı makinenin maksimum kısa değerinden yüksekse, kısa devre yapmak ya beklenmedik sonuçlar doğurur ya da dil desteği ile destekleniyorsa bir istisna oluşturur.
DGoiko

2
Bu mantıkla, iki giriş eklemek uzun bir sonuç verir;)
matt

1
Ve eğer toplamlarım Tamsayı.MAX_VALUE değerini geçebilirse buna bakarım. İnt i döndürme kararını savunmuyorum (ki bu muhtemelen HW'nin toplamları gerçekleştirme şekline bağlıdır), sadece insanların sonucun oraya koymadan önce kısa sürede doldurduğunu doğrulaması gerektiğini söylüyorum. Muhtemelen ilgili sayıların boyutu nedeniyle, int aswell sınırlamasına göre kısa kapasiteyi sınırlayan daha fazla hatayla karşılaştım. Kısa
kapama

1
Yorumumu tekrar okudum ve amacımı netleştirmedim. İlk cümle kafa karıştırıcı ve bunu söylememeliydim ve geri kalanını bırakmamalıydım, iki ilgili ifade var gibi görünüyor. Short + short int olmasının arkasındaki sebep buradan okunabilir: docs.oracle.com/javase/specs/ jvms / se8 / html /… , JVM'de kısaca toplama işlemi yoktur. Java'nın int'i 32 bittir ve bu kararlar yapıldığında çoğu bilgisayar 32 bitti, bu yüzden int en iyi fikir gibi görünüyordu sanırım.
DGoiko

1
Ayrıca, burada açıklandığı gibi, stackoverflow.com/a/27123302/9465588 , JVM'nin aslında sınıf alanı başına sanal bellek alanının en az 32 bitini hizmet verdiğini, bu nedenle kısa alanların bildirilmesinin bellekten hiç tasarruf etmediğini unutmayın. Java'nın bunu değiştirip değiştirmediğini bilmiyorum. Bir
DAO'da olduğu

8

Kullanabilirsiniz setTableId((short)100). Bunun Java 5'te değiştirildiğini düşünüyorum, böylece bayta veya kısaya atanan sayısal değişmezler ve hedef için aralık dahilinde otomatik olarak hedef türü varsayılır. Ancak en son J2ME JVM'leri Java 4'ten türetilmiştir.


Not: J2ME için orta çağ kodlama sancısına hoş geldiniz. Elde taşınan cihazların 2000 yılı masaüstü bilgisayarları yakalaması için sabırsızlanıyorum.
Lawrence Dol

3
"J4" yok (ve "J5" yok. Lütfen Java sürüm belirleme / adlandırma şemasını olduğundan daha fazla kafa karıştırıcı yapmayın.
Joachim Sauer

2
@Joachim: Java 1, Java 2, Java 5, Java 6 ve Java 7 iyi bilinmekte ve bu şekilde bahsedilmektedir; Java 3 ve Java 4 ile neyin kastedildiğini tahmin etmek çok zor değil. "Jn", bariz olanın kısaltmasıdır. Sun'ın mevcut (ve umarız nihai) terminolojisini tüm sürümler için benimsemek kafa karışıklığını azaltır.
Lawrence Dol

2
@Joachim: Sun'ın konuyla ilgili son sözüne göre, önde gelen "1." Java "1.x", tartışılan sürümlere atıfta bulunulurken hiç orada değilmiş gibi ele alınacak ve yalnızca uyumluluk için JVM'ler tarafından yayınlanan sürümde tutulacak. Bu nedenle Java 2, daha önce 1.2 olarak bilinen ve J2SE'nin ilk geldiği sürümdür (aynı zamanda Sun'ın artık J2xE'yi değil, JavaEE, JavaSE ve JavaME'yi önerdiğini not edeceksiniz). 1.3 Java 3, 1.4 Java 4, 1.5 Java 5, 1.6 Java 6 ve 1.7 Java 7'dir. Cidden, bunu anlamak o kadar da zor değil.
Lawrence Dol

2
"1." oldu sadece Java 5 ve sonrası arasında kesti. Java 1.0-1.4 her zaman Sun tarafından bu isimle anılır. Ve bu kasıtlı olarak yapıldı, çünkü Sun Java 1.2'den Java 1.5 / Java 5'e atıfta bulunmak için "Java 2" kullandı. Bu çok kafa karıştırıcı, ancak Sun'ın hiç kullanmadığı yeni isimler icat etmek işi kolaylaştırmıyor.
Joachim Sauer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.