デフォルト値を明示的に渡してみることができます:
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
デフォルトのコンストラクターがない場合はどうなりますか?
- デフォルトのコンストラクターが自明でないことを行う場合はどうなりますか?
- デフォルトのコンストラクターで構築した後、値が実際には使用できない場合はどうなりますか (追加の初期化が必要なため)?