[英]Where is toString() overridden on java.util.List
我想知道為什么這個斷言在 JUnit 中有效:
assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());
我在 List 或 Collection 的任何地方都看不到 toString() 被覆蓋。
我很高興它有效,但仍然很好奇。
Arrays.asList
返回一個Arrays#ArrayList
擴展AbstractList
擴展AbstractCollection
實現toString
。
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
代碼(在asList
上按F3進入 eclipse 中的聲明是附加源代碼)它返回
return new ArrayList<T>(a);
並且進一步調查Arrays確實有一個toString
重載。
Object
類具有toString()
的實現。 由於每個類都直接或間接地extends
為Object
,如果一個特定的類沒有定義 toString(),它會從層次結構中的父類繼承。
根據UmNyobe評論更新:
在層次結構中,將使用找到的第一個具有所需補充的父類。 在 OP 的問題中,該父類將是AbstractCollection
,它會覆蓋Object
中的toString
。
toString
被ArrayList
覆蓋, Arrays.asList()
返回的List
實現
下面是在Arrays
類中實現asList
方法的方式。
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
覆蓋
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.