17

私は少し混乱しています。引数としてオブジェクトを受け取る関数があります。しかし、プリミティブを渡すだけで、ブールプリミティブをブールオブジェクトとして認識しても、コンパイラは文句を言いません。どうしてこんなことに?

public String test(Object value)
{
   if (! (value instanceof Boolean) ) return "invalid";
   if (((Boolean) value).booleanValue() == true ) return "yes";
   if (((Boolean) value).booleanValue() == false ) return "no";
   return "dunno";
}

String result = test(true);  // will result in "yes"
4

4 に答える 4

32

プリミティブ' true'はオートボックス化されBoolean、これはObject

于 2010-08-30T13:20:27.653 に答える
3

以前の回答が言うように、それはオートボクシングと呼ばれています。

実際、コンパイル時に、primitve値をオブジェクトにjavac変換します。通常、逆変換は、例として、次のコードのために非常に奇妙なものを生成する可能性があることに注意してくださいbooleanBooleanNullPointerException

Boolean b = null;
if(b==true) <<< Exception here !

詳細については、JDKのドキュメントを参照してください。

于 2010-08-30T13:24:03.257 に答える
2

メソッドのこの部分:

  if (((Boolean) value).booleanValue() == true ) return "yes";
  if (((Boolean) value).booleanValue() == false ) return "no";
  return "dunno";

で置き換えることができます

  if (value == null) return "dunno";
  return value ? "yes" : "no";
于 2010-08-30T13:23:10.950 に答える
1

その呼ばれるオートボクシング-Java1.5の新機能

http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

于 2010-08-30T13:21:01.517 に答える