您可以尝试显式传入默认值:
public <T> T valueOrDefault(T input, T fallback) {
return input == null? fallback : input;
}
可以像这样使用:
String query = valueOrDefault(getParameter("query"), "");
if (query.length() == 0) {
...
}
Java 泛型(与例如 C# 相对)的问题是,编译后没有保留类型信息,这将允许类似new T()
的工作。作为一种替代方法(如对您问题的评论中提出的那样),您可以传入类令牌:
public <T> T valueOrDefault(Class<T> token, T value) {
if (value != null) return value;
else {
final Constructor<T> ctor = token.getConstructor();
return ctor.newInstance();
}
}
(为简洁起见,省略了错误检查;代码未经测试,甚至可能无法编译......)不过,这种方法非常脆弱。
- 如果
T
没有默认构造函数怎么办?
- 如果默认构造函数做了不重要的事情怎么办?
- 如果一个值在使用默认构造函数构造后不能真正使用(因为需要额外的初始化)怎么办?