3

int と Integer の 2 つの変数に問題があります。これらはほぼ同じですが、(以下のコードに示すように) いつも同じように動作するとは限りません。これが私の問題です。このコードは完璧に機能します。私はジェネリック メソッド printArray を作成しました。このメソッドは、機能するために (ジェネリックであるため) 任意の種類の変数の配列を必要とします。ここでは、変数の型 Integer を使用します。しかし、配列 'getal' のタイプを (Integer ではなく) int に変更すると、メソッド printArray が機能しなくなります。何故ですか?ジェネリック メソッドは int 型の変数では機能しませんか?

package Oefenen;

public class printArray
{
    public static void main (String args[])
    {
        Integer[] getal = {10, 20, 30, 40, 50};
        printArray(getal);  
    }

    public static <E> void printArray (E[] intArray)
    {
        for (E element : intArray)
        {   
            System.out.printf("%s\n", element);
        }
    }
}

ps:ジェネリック メソッドを int 専用のメソッドに変更すると、機能します。だから私は問題は次のとおりだと考えていました:ジェネリックメソッドは int では機能しません。私は?

4

4 に答える 4

7

ジェネリックメソッドは、Objectのサブタイプでのみ機能します。整数はオブジェクトのサブタイプです。intはオブジェクトではなく、プリミティブです。したがって、これは予想される動作です。このリンクは非常に便利です

この関連する質問も役立つ場合があります

于 2012-11-26T11:11:09.950 に答える
3

ジェネリックはクラスに対してのみ機能します。int、as double、floatなどはクラスではありません

于 2012-11-26T11:11:28.597 に答える
0

ジェネリックは実際の型に対してのみ機能し、int はプリミティブ型 (float、double など) です。

ただし、オートボクシングを使用することもできます。

int primitiveInt = 1;

// this will 'autobox' (transform) the primitive type to a real type.
Integer typedInt = primitiveInt;

逆の方法も機能しますが、実際の型は null である可能性があり、オートボクシングでは処理されないため、NullPointerExceptions が発生する可能性があることに注意してください。(プリミティブ型には常にデフォルト値があります)

于 2012-11-26T11:18:20.657 に答える
0

-Genericクラス、メソッド、変数、インターフェイスで使用できますが、ジェネリックを使用する主な理由の 1 つは、コレクションをタイプ セーフにすることです。

- オブジェクトのみGenericsを扱います。はプリミティブ型ですが、ラッパー オブジェクトです。これは Java 5 から導入されたため、int から Integer に、またはその逆に移動するときに違いを見つけることができません。intIntegerAutoBoxing

-Collectionを使用する場合も、GenericsWrapper オブジェクトが使用されます。

于 2012-11-26T11:22:34.623 に答える