なぜこのアサーションが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
オーバーライドするものになります。toString
Object
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