28

ばかげた質問かもしれませんが、どうすれば取るまたはを取るメソッドに渡すことができますnullか?longint

例:

TestClass{
  public void iTakeLong(long id);
  public void iTakeInt(int id);
}

では、どうすれば両方の方法にnullを渡すことができますか?

TestClass testClass = new TestClass();
testClass.iTakeLong(null); // Compilation error : expected long, got null
testClass.iTakeInt(null);   // Compilation error : expected int, got null

考え、提案?

4

7 に答える 7

51

問題は、intlongがプリミティブであるということです。nullプリミティブ値に渡すことはできません。

確かに、メソッドシグネチャの代わりにラッパークラスIntegerを使用できます。Longlongint

于 2012-04-30T18:58:10.967 に答える
12

あなたはできません-そのような価値はありません。メソッドのシグネチャを変更できる場合は、代わりに参照型を使用するようにすることもできます。Javaは、プリミティブクラスごとに不変の「ラッパー」クラスを提供します。

class TestClass {
  public void iTakeLong(Long id);
  public void iTakeInt(Integer id);
}

これで、null参照またはラッパー型のインスタンスへの参照を渡すことができます。オートボクシングでは、次のように書くことができます。

iTakeInt(5);

メソッド内で、次のように書くことができます。

if (id != null) {
    doSomethingWith(id.intValue());
}

または自動開梱を使用します。

if (id != null) {
    doSomethingWith(id); // Equivalent to the code above
}
于 2012-04-30T18:58:32.390 に答える
7

コンパイルされる非プリミティブ ラッパー クラスに null をキャストできます。

TestClass testClass = new TestClass();
testClass.iTakeLong( (Long)null); // Compiles
testClass.iTakeInt( (Integer)null);   // Compiles

しかし、これはNullPointerException実行時にスローします。あまり役に立ちませんが、プリミティブを引数として取るメソッドに相当するラッパーを渡すことができることを知っておくと役に立ちます。

于 2012-04-30T19:09:02.913 に答える
5

そのようなメソッドの数と呼び出しの数に応じて、別の選択肢があります。

コードベース全体に null チェックを配布する代わりに、ラッパーメソッドを記述できます(NB、型ラッパー (int => Integer) ではなく、独自のものをラップするメソッド):

public void iTakeLong(Long val) {
    if (val == null) { 
        // Do whatever is appropriate here... throwing an exception would work
    } else {
        iTakeLong(val.longValue());
    }
}
于 2012-04-30T19:35:44.553 に答える
3

ラッパー クラスを使用します。

 TestClass{
    public void iTakeLong(Long id);
    public void iTakeInt(Integer id);
    public void iTakeLong(long id);
    public void iTakeInt(int id);
 }
于 2012-04-30T18:58:56.050 に答える
2

それをしてはいけない。nullプリミティブ型はJavaに含めることはできません。

合格したい場合nullは、メソッドのシグネチャを次のように変更する必要があります

public void iTakeLong(Long id);
public void iTakeInt(Integer id);
于 2012-04-30T18:58:15.023 に答える
1

以下のように値を型キャストするLongと、コンパイル エラーは消えますが、最終的にはNullPointerException.

testClass.iTakeLong((Long)null)

Long1 つの解決策は、プリミティブの代わりに型を使用することlongです。

public void iTakeLong(Long param) { }

他の解決策は、org.apache.commons.lang3.math.NumberUtils

testClass.iTakeLong(NumberUtils.toLong(null))
于 2017-04-10T17:02:08.637 に答える