1

なぜこのアサーションがJUnitで機能するのか疑問に思いました。

assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());

リストまたはコレクションのどこでもtoString()がオーバーライドされているのがわかりません。

それがうまくいくことを嬉しく思いますが、それでも興味があります。

ありがとう、デクラン

4

6 に答える 6

11

Arrays.asListを実装するextendsArrays#ArrayListAbstractList返します。AbstractCollection toString

于 2012-09-24T09:14:55.153 に答える
1

toStringは、:のスーパークラスであるAbstractCollectionによってオーバーライドされます。

  • AbstractList
  • AbstractQueue
  • AbstractSet
  • ArrayDeque

によって返される要素は、.asListおそらく次のサブクラスです。AbstractList

于 2012-09-24T09:17:34.360 に答える
1

Listとは両方ともCollectionインターフェースです。メソッドtoString()はでオーバーライドされAbstractCollectionます。

とにかく、オブジェクトの文字列表現を比較することは悪い習慣です。あなたは使用する必要があります

assertEquals(expectedList, actualList)代わりは。

どこ

expectedList = Arrays.asList(new String[] {"String1", "String2", "String3"})

またはあなたの場合はさらに良いです:

assertArrayEquals(expectedArray, actualArray)

org.junit.Assertの代わりに新しいものを使用する必要があることに注意してくださいjunit.framework.Assert。新しい実装には、配列比較ユーティリティを含む多くのメソッドがあります。

于 2012-09-24T09:18:37.447 に答える
1

あなたがasListコードに到達した場合(押すと、ソースコードが添付されている日食の宣言F3asList行きます)、それは戻ります

 return new ArrayList<T>(a);

さらにアレイを調査すると、toString過負荷になります。

于 2012-09-24T09:21:26.283 に答える
0

Objectクラスにはの実装がありtoString()ます。すべてのクラスは直接的または間接的extendsObjectになります。特定のクラスがtoString()を定義していない場合、そのクラスは階層内の親クラスから継承されます。

UmNyobeのコメントに基づいて更新

階層では、必要な実装を持つ最初に見つかった親クラスが使用されます。OPによる質問では、その親クラスはからAbstractCollectionオーバーライドするものになります。toStringObject

于 2012-09-24T09:16:28.703 に答える
-2

toStringによってオーバーライドされArrayListList実装はによって返されますArrays.asList()

このasListメソッドがクラスにどのように実装されているかを次に示しArraysます。

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

ここArrayListで、は静的内部クラスですArrays

private static class ArrayList<E> extends AbstractList<E>

ArrayListええ、まあ、その祖先によって直接オーバーライドされるのではなく、AbstractList

于 2012-09-24T09:14:52.237 に答える