8

List<?>引数としてaを取るメソッドがあります。

public static String method(List<?> arg){
     // Do something based on type of the list
}

//I call the method as below
List<ClassA> listA = new ArrayList<ClassA>();
List<ClassB> listB = new ArrayList<ClassB>();
method(listA);
method(listB);

で、がのか、のmethodかをどのように知ることができますか?argListClassAListClassB

4

2 に答える 2

24

技術的に言えば、オブジェクトが特定のタイプであるかどうかを確認するために使用できます。instanceof

しかし...それは良い考えではありません。

メソッドを宣言した方法では、任意のタイプのリストを受け入れることができるため、必ずしもAまたはBになるとは限りません。

何をしようとしているのかを判断するのは難しいですが、おそらくメソッドをジェネリックにする必要があります。

あなたはこのようにそうすることができます:

public static <T> String method(List<T> arg) {
    // We now know that the type of the list is T, which is
    // determined based on the type of list passed to this
    // method.  This would demonstrate the point better if
    // the return type was T, but I'm leaving the return type
    // as String, because that's what your code returns.
}

より良い例を次に示します。

リストの最初の要素を返すジェネリックメソッドを作成する場合は、次のようにします。

public static <T> T firstElement(List<T> theList) {
    if (theList == null) {
        return null;
    }
    T objectOfTypeT = theList.get(0);
    return objectOfTypeT;
}

戻りタイプがになっていることに注意してくださいT

このメソッドをジェネリックにしたため、リストで使用されているのと同じ型を返すことができます。

通常は単に戻るだけですがtheList.get(0)、ジェネリックスの目的をより明確にするために行を追加しました。

構文の説明:

  • <T>、このメソッドがTという名前の1つのタイプパラメータを取ることを示します。

  • 直後に続くのTは戻り型です(通常、文字列、整数などを返すのと同じように)。

  • ListパラメーターのTは、コンパイラーが一体何であるかを知る方法Tです。

これにより、コンパイラは次のように言うことができます。このメソッドの整数のリスト。Tは整数である必要があります。 "

対照的に、メソッドは文字列のみを返すことができ、リストでどのタイプが使用されているかはわかりません。


また...

AとBの両方がTheParentClassという名前の同じクラスを拡張する場合、次のようにメソッドを宣言できます。

public static String method(List<? extends TheParentClass> arg)

そうすれば、パラメーターの可能なタイプについてもう少し知ることができます(そして、コンパイル時のタイプチェックの恩恵を受けることができます)。

于 2012-04-13T22:38:43.287 に答える
4

Romainというユーザーの回答から 「 < ?> を使用する場合は、パラメータ化された型をどこにも使用しないことを意味します。特定の型 (あなたの場合は List< String> のようです) に移動するか、非常に一般的な List< Object> "

また、疑問符を使用すると、コンパイラは実行時まで型の不一致をキャッチせず (具体化; 効果的な Java の p.119)、消去をバイパスし、ジェネリック型を使用することから得られる利点を効果的に排除すると思いますか???

質問者の質問に答えるには: List< Object> を使用してから、おそらく instanceOf を使用して A または B にキャストしようとすると、それが何であるかを伝える方法になる可能性があります。それよりも良い方法があると思います。

于 2012-04-13T22:31:40.707 に答える