0

重複の可能性:
ジェネリック型のコンストラクターの呼び出し

anytype の値に対して null をチェックし、それに応じて同じ型の値を返すメソッドを書きたいと思います。null または同じ型の新しいオブジェクトでない場合、任意のパラメーターを渡して同じものを返すことができるように、一般的な方法で記述するにはどうすればよいですか?

このようなものは役に立ちますが、明らかに以下はうまくいきません:

public T getValue(T param) {
    if (null != param) {
        return param;
    } else {
        return ""; // or return new T
    }
}
4

1 に答える 1

2

デフォルト値を明示的に渡してみることができます:

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();
    }
}

(簡潔にするためにエラー チェックは省略されています。コードはテストされておらず、コンパイルすらできない可能性があります...) ただし、このアプローチはかなり脆いものです。

  1. Tデフォルトのコンストラクターがない場合はどうなりますか?
  2. デフォルトのコンストラクターが自明でないことを行う場合はどうなりますか?
  3. デフォルトのコンストラクターで構築した後、値が実際には使用できない場合はどうなりますか (追加の初期化が必要なため)?
于 2012-07-22T12:57:26.163 に答える