3

引数が null の場所をチェックし、null の場合はその型の新しいオブジェクトを返すメソッドを書きたいと思います。次のようになります。

public static <T> T checkNull(T obj) {
    if (null == obj) return someHowCreateTheObjectWithTypeT();
    else return obj;
}

苦労して掘り下げた後、私はまだこれを達成する方法を得ることができません.Javaで実際に可能ですか?

私は最初に反省について考えました。しかし、オブジェクトが null の場合は Class インスタンスを取得できず、型 T の名前なしで Class を作成することはできません...

アップデート:

クラスをパラメーターとして渡すことを考えましたが、次の回答が示すように、それは最善の解決策ではありません:)

私の現在の解決策は、defaultValue パラメータを使用することです。

public static <T> T checkNull(T obj, T defaultValue) {
    if (null == obj) return defaultValue;
    return obj;
}

これは、リフレクション ソリューションよりも高速で安全であり、同じ詳細です。しかし、すべてのタイプの対象に対して体系的に DEFAULT_VALUE を指定する必要があり、これは簡単な作業ではありません。

4

4 に答える 4

3

一般情報はコンパイル時のみであり、実行時には利用できません。オブジェクトのクラスをヒントとして渡す必要があり、クラスにはパブリックのデフォルト コンストラクターが必要です。例えば

public static T checkNull(Object o, Class<T> c) {
  try {
    return (o == null) ? c.newInstance() : o;
  } catch (Exception e) {
    return null;
  }
}
于 2010-11-04T15:43:13.783 に答える
3

これは不可能です。ジェネリックがこのように機能するには、コンパイル時に呼び出される型をキャプチャする必要があります。ただし、nullタイプがないため、 T を特定してインスタンス化することはできません。

これで、Class インスタンスを渡すことでこれを回避できるかもしれませんが、リフレクションを使用してかなり堅牢なエラー処理を行い、型 T が具体的なクラスであり、呼び出し可能なパブリック パラメーターなしのコンストラクターを持っていることを確認する必要があります。

于 2010-11-04T15:43:21.583 に答える
2

できません。の追加パラメーターを追加し、Class<T>それを使用して反射的に新規作成する必要があります。型 T は、コンパイル プロセスを生き残ることはできません。

于 2010-11-04T15:43:29.513 に答える
1

他の人が指摘したように、これはできません。ただし、Guavaは、投稿したメソッドのデフォルト値と同等のものを提供します。

String foo = Objects.firstNonNull(someString, "default");

これは、両方の引数が である場合firstNonNullに をスローするという点で、メソッドとは少し異なります。NullPointerExceptionnull

Supplier<T>別のオプションは、Guava のインターフェースなどを利用するメソッドを作成することです。

public static T firstNonNull(T first, Supplier<? extends T> defaultSupplier) {
  return first != null ? first : Preconditions.checkNotNull(defaultSupplier.get());
}

Supplier次に、最初の引数が null の場合にのみ、新しいデフォルト インスタンスを作成して返す を使用できます。

于 2010-11-04T16:06:07.757 に答える