2013-03-26 62 views
0

我寫這將通過它嘗試了class.cast驗證屬性的通用方法,但我不斷收到一個ClassCastExceptionClassCastException異常使用Class.cast使用泛型

...類來測試

public <T> T get(Properties p, String propKey, Class<T> clazz) throws Exception { 

    T val = null; 

    Object propValue = p.get(propKey); 

    if(propValue== null) { 
     throw new Exception("Property (" + propKey + ") is null"); 
    } 

    try { 
     val = clazz.cast(propValue); // MARKER 

    } catch(Exception e) { 
     throw new Exception("Property (" + propKey + ") value is invalid value of type (" + clazz + ")", e); 
    } 



    return val; 
} 

...測試類

@Before 
public void setUp() { 
    propUtil = new PropUtil(); 
    properties = new Properties(); 
    properties.setProperty("test.int.prop", "3"); 
} 

@Test 
public void testGet() { 

    try { 

     assertEquals(new Integer(3), propUtil.get(properties, "test.int.prop", Integer.class)); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

在MARKER在註釋中的代碼導致ClassCastException異常。

任何想法非常讚賞。

回答

0

感謝您的回覆。我意識到從String到Integer投射的基本動作是不可能的。我只是想讓方法變得更加輕鬆,併爲我進行轉換檢查。我剛剛制定了我在使用Reflection查找的解決方案:

Object propValue = p.get(propKey); 
    Constructor<T> constructor = clazz.getConstructor(String.class); 
    val = constructor.newInstance(propValue); 

即使用接受String.class的公共構造函數(即,字符串屬性值)

作品一個款待。

+1

不錯的解決方法,如果沒有該簽名的構造函數,[NoSuchMethodException](http://docs.oracle.com/javase/6/docs/api/java/lang/NoSuchMethodException.html)被拋出女巫似乎在你的代碼中處理。 – A4L 2013-03-26 20:58:42

2

假設Properties這裏是java.util.Properties,值始終爲String s。

您應該使用getProperty()方法,而不是get()方法恰好是從HashTable可見的,因爲這個類撥回當Java鄉親約組成與繼承少小心。

+0

是的。它們始終是String,但屬性將包含String,Integers和Doubles,所以我希望泛型方法執行轉換並在實際值不可分配類時引發異常。 – solarwind 2013-03-26 20:24:11

3

Properties類是Hashtable商店String對象,特別是當您撥打setProperty時。您已添加String「3」,而不是整數3。您正在有效嘗試投射「3」作爲Integer,以便正確投出ClassCastException。嘗試

assertEquals("3", propUtil.get(properties, "test.int.prop", String.class)); 

或者,如果你想get返回Integer,那麼就使用一個Hashtable<String, Integer>,或者甚至更好,使用HashMap<String, Integer>

+1

@Downvoter,請解釋您爲什麼downvoted。 – rgettman 2013-03-26 20:38:54

+0

謝謝。請參閱下面的答案。 – solarwind 2013-03-26 21:13:34

1

此行

properties.setProperty("test.int.prop", "3"); 

把一個java.lang.String在性能

和你傳遞Integer.class你泛型方法。所以預計ClassCastException

如果你想測試Integer.class你必須把一個整數

properties.put("test.int.prop", 3); 

注意,在上述行使用put因爲Properties類擴展Hashtable

如果你的意圖是把一個String和測試Integer然後你必須以某種方式parse該字符串到一個整數值

+2

'setProperty'方法需要一個'String'作爲值,而不是'int'。 – rgettman 2013-03-26 20:25:16

+0

@rgettman,複製粘貼過快,修復它,謝謝! – A4L 2013-03-26 20:30:39

+0

謝謝。請參閱下面的答案。 – solarwind 2013-03-26 20:48:22