2017-07-26 359 views
1

在我的項目我有一個枚舉這樣的:java.lang.ClassCastException:java.lang.Short中不能轉換爲java.lang.Integer中

public enum MyEnum { 

FIRST(1), 

SECOND(2); 

private int value; 

private MyEnum(int value) { 
    this.value = value; 
} 

public int getValue() { 
    return value; 
} 

public static MyEnum fromValue(int value) { 
    for (MyEnum e : MyEnum.values()) { 
     if (e.getValue() == value) { 
      return e; 
     } 
    } 
    return null; 
} 

而且我有這樣的代碼:

Map<String, Object> myMap = new HashMap<>(); 
// Fill my Map with data from database 
myMap = namedParameterJdbcTemplate.queryForList(qry, paramsMap); 

***if (Arrays.asList(MyEnum.values()) 
       .contains(MyEnum.fromValue((int) 
       myMap.get("myKey")))))*** { 
    // Do something 
    } 

我得到的異常

java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Integer** on this line : **if (Arrays.asList(MyEnum.values()) 
      .contains(MyEnum.fromValue((int)myMap.get("myKey"))))) 

MYMAP充滿了從數據庫中的數據,知道它是一個SQL Server數據庫,而且的myKey從數據庫返回的數據庫類型TINYINT的。

你能告訴我我做錯了什麼嗎? 謝謝。

問候。

+0

順便說一句,'EnumSet.allOf(MyEnum.class)'遠比Arrays.asList更有效(易讀)(MyEnum.values())。有關更多信息,請參見[文檔](http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html)。 – VGR

+0

感謝您的評論,我會嘗試! – niryo

回答

0

java.lang.ClassCastException:java.lang中。短期不能轉換爲java.lang.Integer的

這裏myMap.get("myKey")返回Short實例,但返回的聲明對象是Object,因爲地圖被聲明爲Map<String, Object>

這是因爲如果你這樣寫:

Object myValue = myMap.get("myKey") 

然後你通過聲明爲ObjectMyEnum.fromValue()有作爲參數的intShort對象。

MyEnum.fromValue((int)myValue)); 

編譯器試圖這樣的對象投射到一個Integer
但它不是Integer而是Short
所以演員失敗。

要解決你的問題,你應該首先檢查你的對象的實例。
如果對象不是Short的實例,則應拋出異常或忽略該值。
如果是,你應該投從ObjectShort,並通過這個ShortfromValue(),這將是自動拆箱到short

Object myValue = myMap.get("myKey"); 
    if (!(myValue instanceof Short)){   
     throw new YourRuntimeException("A Short is expected but get a " + myValue.getClass()); 
     // or ignore the value 
    } 

    if (Arrays.asList(MyEnum.values()) 
       .contains(MyEnum.fromValue(((short) myValue)) { 
      .... 
    } 
+0

謝謝你的作品。然而,我已經寫了這部分代碼的作品:Short i = new Short((short)1); int j =(int)i; System.out.println(i); 。這是同樣的事情,在這種情況下,你能告訴我爲什麼嗎?我只是想明白。先謝謝你。 – niryo

+0

原因很簡單。這裏'int j =(int)i;'編譯器將'short'從'short'變爲'short',然後進行從'short'到'int'的擴展轉換。 \t \t除了演員陣容沒有用於拓寬轉換。 'int j = i;'就夠了。只需要縮小轉換範圍。 在你的實際代碼中,'Short'實例被聲明爲'Object'。所以編譯器不會試圖解開它,而是直接對目標進行強制轉換。我編輯解釋它,並提供更有效的解決方案。 – davidxxx

+0

非常感謝,我現在明白了。 – niryo

0

這裏:

(int)myMap.get("myKey") 

我猜get方法返回一個Short對象,它不能被強制轉換爲整數的參考,因爲短期不會整數繼承。

你可以做的是鑄造短,然後調用intValue method,就像這樣:

((Short)myMap.get("myKey")).intValue() 

將返回一個整數值

+0

謝謝,它的工作。但我不得不選擇最乾淨的解決方案 – niryo

0

試試這個。

(int)(short)myMap.get("myKey") 
相關問題