0

我正在编写一个通用方法,它将通过在其上尝试 class.cast 来验证属性,但我不断收到 ClassCastException

... 测试类

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。

任何想法都非常感谢。

4

4 回答 4

3

该类Properties是一个Hashtable存储String对象,尤其是当您调用setProperty. 您添加了String“3”,而不是整数3。您实际上是在尝试将“3”转换为Integer,以便正确抛出ClassCastException. 尝试

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

或者,如果您返回getan Integer,则只需使用 a Hashtable<String, Integer>,或者更好的是使用 a HashMap<String, Integer>

于 2013-03-26T20:23:25.590 回答
2

假设Properties这里是java.util.Properties,值总是Strings。

您应该使用该getProperty()方法,而不是get()碰巧从中可见的方法,HashTable因为当 Java 人员对组合与继承不太注意时,该类被写回。

于 2013-03-26T20:22:20.303 回答
1

这条线

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

将 ajava.lang.String放入属性

并且您将Integer.class通用方法传递给您。所以ClassCastException是意料之中的!

如果你想测试Integer.class你必须放一个整数

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

请注意,在上一行中使用put因为Properties类正在扩展Hashtable

如果您的意图是放置一个String 并测试一个,Integer那么您必须以某种方式将该字符串解析为一个整数值

于 2013-03-26T20:23:49.227 回答
0

感谢您的回复。我意识到从 String 转换为 Integer 的基本行为是不可能的。我只是想让方法更流畅并为我做转换检查。我刚刚使用反射解决了我正在寻找的解决方案:

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

即使用采用 String.class 的公共构造函数(即 String 属性值)

工作一种享受。

于 2013-03-26T20:33:59.770 回答