[英]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.doubleToLongBits和Float.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.