簡體   English   中英

奇怪的Java強制轉換異常。為什么我不能將Long投入Float?

[英]Strange Java cast exception. Why can't I cast Long to a Float?

為什么我不能將Long投入Float?

我收到此錯誤消息:

java.lang.ClassCastException:java.lang.Long無法強制轉換為java.lang.Float

為什么這是個問題? 我想要施放的數字是域[-10.0,10.0]中的小數。 它們從使用JFormattedTextField.getValue()返回的Object實例開始。 但它們必須轉換成浮點數。

堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Float
    at submodeler.animation.Timeline.setKeyedAttribute(Timeline.java:59)
    at submodeler.ui.attributes.TransformationAttributePanel.actionPerformed(TransformationAttributePanel.java:247)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6348)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6113)
    at java.awt.Container.processEvent(Container.java:2085)
    at java.awt.Component.dispatchEventImpl(Component.java:4714)
    at java.awt.Container.dispatchEventImpl(Container.java:2143)
    at java.awt.Component.dispatchEvent(Component.java:4544)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
    at java.awt.Container.dispatchEventImpl(Container.java:2129)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4544)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

如果你提供一個堆棧跟蹤,它會有所幫助。

否則,標准解決方案是用someLongValue.floatValue()替換(Float) someLongValue

如果你正在處理基本類型,你可以從long轉換為float,雖然它是5.1.2擴展原始轉換 ,但可能會失去精度,所以要小心! 顯然你有包裝類型Long ,它不能被隱式轉換,因此你得到classcastexception。 這可能是因為自動裝箱或顯式Long對象創建。

更一些未經邀請的建議:如果您的有效值是-10到+10范圍內的小數,則標准數據類型為int (原始)。 如果你指的是確切數字,請避免浮動 long也不是最優的,因為它不像int那樣是完全原子的,它需要2倍的內存。 如果允許“未分配”的其他狀態,那么可能為null的Integer也可以。

發生異常是因為編譯器識別出Long和Float沒有父子依賴關系。 與C ++不同,后者將嘗試查找重載的強制轉換運算符。

您可以在從Number派生的任何原始包裝器類型上調用doubleValue(),因此這是執行所需操作的推薦方法:

double val = ((Number)textField.getValue()).doubleValue()

這里需要注意幾點:首先,我將getValue()的輸出轉換為Number。 這樣,您可以改變主意,並在將來實際返回Double值,並且您不會破壞。

另外,我使用的是double值,而不是float。 JVM在內部使用double,因此除了節省數組中的空間之外沒有理由使用float。

基本上,將long轉換為float就像這樣簡單:

float f = (float)myLongVar;

我沒有使用JFormattedTextField經驗,但您可以嘗試將返回的對象類型轉換為String,使用.substring()來獲取確切的值,並將其類型轉換為long。 這可能不是正確的方法,但它可以解決您的問題。

試試這個:

Long l = ...
Float f = new Float ((float)l.longValue());

即,您必須將Long轉換為原始(即非對象)類型。

如果要將float / double的機器位表示轉換為/從字節轉換,請參閱Double.doubleToLongBitsFloat.floatToIntBits及相關函數。

我在將JSONObject轉換為Java對象時遇到了這個問題。 我不得不從double a = (double) json.get("myJSONKey");更改我的代碼double a = (double) json.get("myJSONKey"); 以下內容:

try {
  double a = Double.parseDouble((String) myJSONObject.get("myJSONKey"));
} catch(NumberFormatException e)
{
  System.err.out("I could not convert it to a double!! :(");
}

請注意,您不必執行try / catch,但我喜歡這樣,我很干凈:)。

如果你已經有一個long值(或int或者其他),那么使用String.valueOf(myInt)來獲取你的字符串。

希望這可以幫助,

-安德魯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM