2

オブジェクトを取るメソッドにプリミティブを渡すことができるのはなぜですか? プリミティブはオブジェクト化されていますか? int = Integer と boolean = Boolean のように?

次の関数を呼び出すことができます。

hash(41, 0);

    public static int hash(int seed, Object object)
    {
        int result = seed;
        if(object == null)
        {
            return hash(result, 0);
        }
        else if(!isArray(object))
        {
            result = hash(result, object.hashCode());
        }
        else
        {
            int length = Array.getLength(object);
            for(int index = 0; index < length; ++index)
            {
                Object item = Array.get(object, index);
                // prevent looping if item in array references the array itself
                if(!(item == object))
                {
                    result = hash(result, item);
                }
            }
        }
        return result;
    }
4

3 に答える 3

4

はい、これはボクシング コンバージョンと呼ばれます。int値は である に「ボックス化」されIntegerますObject。1.5 以降、Java で使用できます。

JLSのセクション 5.1.7には、利用可能なボクシング変換がリストされています。

ボックス変換は、プリミティブ型の式を参照型の対応する式に変換します。具体的には、次の 9 つの変換をボクシング変換と呼びます。

  • ブール型からブール型へ

  • バイト型からバイト型へ

  • ショートタイプからショートタイプへ

  • char型からCharacter型へ

  • int型からInteger型へ

  • ロングタイプからロングタイプへ

  • フロート型からフロート型へ

  • double型からdouble型へ

  • null型からnull型へ

さらに、メソッド呼び出し conversion中にボックス化変換が許可されます。これは実際にここで行われていることです。int 0が を期待するメソッドに渡されているため、値は別の型に変換されていObjectます。JLSのセクション 5.3には、メソッド呼び出し変換の 1 つの方法としてボックス化変換がリストされています。

メソッド呼び出しコンテキストでは、次のいずれかを使用できます。

  • 恒等変換 (§5.1.1)

  • 拡張プリミティブ変換 (§5.1.2)

  • 拡大参照変換 (§5.1.5)

  • ボックス化変換 (§5.1.7) に続いて、オプションで拡大参照変換

  • ボックス化解除変換 (§5.1.8) の後に、必要に応じて拡張プリミティブ変換が続きます。

于 2013-10-15T16:43:29.627 に答える
1

はい、できます。オートボクシング/アンボクシングと呼ばれるものは、コンパイラによって自動的に行われます。これはドキュメントからの抜粋です。

オートボクシングは、Java コンパイラがプリミティブ型とそれに対応するオブジェクト ラッパー クラスとの間で行う自動変換です。たとえば、int から Integer への変換、double から Double への変換などです。変換が逆の場合、これはボックス化解除と呼ばれます。

int i = 1;
Integer boxI = i; // Autoboxing is performed automatically by the compiler

Integer ii = 1;
int i = ii; // Auto(un)boxing is performed automatically by the compiler
于 2013-10-15T16:43:23.893 に答える
0

はい、プリミティブはオブジェクトに変換され、その逆も同様です。この概念は、ボックス化およびボックス化解除と呼ばれます。Java の新しいバージョンでは、これは自動的に行われるため、自動ボクシングおよび自動アンボックスと呼ばれます。

Boxing と UnBoxing の Oracle ドキュメント

各プリミティブには、対応する Wrapper クラスがあります。

  • 整数 -> 整数
  • ブール値 -> ブール値
  • 文字 -> 文字

等々。

于 2013-10-15T16:43:58.973 に答える