なぜこのアサーションがJUnitで機能するのか疑問に思いました。
assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());
リストまたはコレクションのどこでもtoString()がオーバーライドされているのがわかりません。
それがうまくいくことを嬉しく思いますが、それでも興味があります。
ありがとう、デクラン
なぜこのアサーションがJUnitで機能するのか疑問に思いました。
assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());
リストまたはコレクションのどこでもtoString()がオーバーライドされているのがわかりません。
それがうまくいくことを嬉しく思いますが、それでも興味があります。
ありがとう、デクラン
Arrays.asListを実装するextendsArrays#ArrayListをAbstractList返します。AbstractCollection toString
toStringは、:のスーパークラスであるAbstractCollectionによってオーバーライドされます。
によって返される要素は、.asListおそらく次のサブクラスです。AbstractList
Listとは両方ともCollectionインターフェースです。メソッドtoString()はでオーバーライドされAbstractCollectionます。
とにかく、オブジェクトの文字列表現を比較することは悪い習慣です。あなたは使用する必要があります
assertEquals(expectedList, actualList)代わりは。
どこ
expectedList = Arrays.asList(new String[] {"String1", "String2", "String3"})
またはあなたの場合はさらに良いです:
assertArrayEquals(expectedArray, actualArray)
org.junit.Assertの代わりに新しいものを使用する必要があることに注意してくださいjunit.framework.Assert。新しい実装には、配列比較ユーティリティを含む多くのメソッドがあります。
あなたがasListコードに到達した場合(押すと、ソースコードが添付されている日食の宣言F3にasList行きます)、それは戻ります
return new ArrayList<T>(a);
さらにアレイを調査すると、toString過負荷になります。
Objectクラスにはの実装がありtoString()ます。すべてのクラスは直接的または間接的extendsにObjectになります。特定のクラスがtoString()を定義していない場合、そのクラスは階層内の親クラスから継承されます。
UmNyobeのコメントに基づいて更新:
階層では、必要な実装を持つ最初に見つかった親クラスが使用されます。OPによる質問では、その親クラスはからAbstractCollectionオーバーライドするものになります。toStringObject
toStringによってオーバーライドされArrayList、List実装はによって返されます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