作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 java.util.Properties
向我的应用添加了一个人类可读的配置文件并试图在它周围添加一个包装器以使类型转换更容易。具体来说,我希望返回值从提供的默认值“继承”它的类型。到目前为止,这是我得到的:
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)
的返回值将是一个 boolean 值,无论它是否是从属性文件中读取的,对于字符串、整数、 double 等也是如此。当然,上面的代码片段实际上并没有编译:
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);
}
最佳答案
由于type erasure ,您不能实例化通用对象。通常你可以保留对 Class
的引用表示该类型的对象并使用它来调用 newInstance()
.但是,这仅适用于默认构造函数。由于您想使用带参数的构造函数,因此您需要查找 Constructor
对象并将其用于实例化:
protected <T> T getProperty(String key, T fallback, Class<T> clazz) {
String value = properties.getProperty(key);
if (value == null) {
return fallback;
} else {
//try getting Constructor
Constructor<T> constructor;
try {
constructor = clazz.getConstructor(new Class<?>[] { String.class });
}
catch (NoSuchMethodException nsme) {
//handle constructor not being found
}
//try instantiating and returning
try {
return constructor.newInstance(value);
}
catch (InstantiationException ie) {
//handle InstantiationException
}
catch (IllegalAccessException iae) {
//handle IllegalAccessException
}
catch (InvocationTargetException ite) {
//handle InvocationTargetException
}
}
}
但是,看到实现这一点有多么麻烦,包括使用反射的性能成本,值得先研究其他方法。
如果你绝对需要走这条路,并且如果 T
仅限于编译时已知的一组不同类型,折衷方案是保持静态 Map
的 Constructor
s,它在启动时加载 - 这样您就不必在每次调用此方法时动态查找它们。例如 Map<String, Constructor<?>>
或 Map<Class<?>, Constructor<?>>
,使用 static block 填充.
关于java - 如何在 Java 中实例化泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6916346/
我是一名优秀的程序员,十分优秀!