我已经使用java.util.Properties
向我的应用程序添加了一个可读的配置文件,并且试图在其中添加一个包装来使类型转换更容易。具体而言,我希望返回的值从所提供的默认值“继承”它的类型。下面是我到目前为止有:如何在Java中实例化泛型类型?
protected <T> T getProperty(String key, T fallback) {
String value = properties.getProperty(key);
if (value == null) {
return fallback;
} else {
return new T(value);
}
}
从getProperty("foo", true)
的返回值将被一个布尔无论它是从属性文件读取,同样的字符串,整数,双打, & c。当然,上面的代码实际上并不编译:
PropertiesExample.java:35: unexpected type
found : type parameter T
required: class
return new T(value);
^
1 error
我这样做不对,还是我只是试图做一些事情不能做呢?
编辑:用例:
// I'm trying to simplify this...
protected void func1() {
foobar = new Integer(properties.getProperty("foobar", "210"));
foobaz = new Boolean(properties.getProperty("foobaz", "true"));
}
// ...into this...
protected void func2() {
foobar = getProperty("foobar", 210);
foobaz = getProperty("foobaz", true);
}
即使使用默认构造函数,最好使用'Constructor'对象而不是使用'Class.newInstance()'。错误处理是不同的;使用'Class'方法,一些例外情况会以误导性的类型报告。 'Constructor'方法与其他动态调用一致。 – erickson
@Kublai Khan - Works!更好的是,我可以将'klazz'作为'类 klazz =(类)fallback.getClass();'来消除额外的参数。非常感谢你的帮助! **编辑:**一旦反射进入图片,我开始怀疑缓存;我会看那个静态块。 –
很高兴我能帮到你。请记住,所有使用反射的动态查找都非常昂贵,因为它们无法在编译时进行优化。 –