我想知道为什么这个断言在JUnit中起作用:
assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());
我看不到在List或Collection上的任何地方覆盖toString()。
我很高兴它有效,但仍然很好奇。
谢谢,Declan
答案 0 :(得分:10)
Arrays.asList
返回AbstractList
,AbstractCollection
延伸{{1}} an Arrays#ArrayList
。
答案 1 :(得分:1)
toString被AbstractCollection覆盖,{{3}}是一个超类:
.asList
返回的元素可能是AbstractList
答案 2 :(得分:1)
如果你需要asList
代码(在asList
上按 F3 转到eclipse中的声明是附加源代码)它返回
return new ArrayList<T>(a);
进一步调查Arrays确实有toString
重载。
答案 3 :(得分:0)
Object
课程已实施toString()
。由于每个类直接或间接extends
到Object
,如果某个特定类没有定义toString(),它将从层次结构中的父类继承。
更新基于UmNyobe评论:
在层次结构中,将使用找到具有所需实现的第一个父类。在OP的问题中,该父类将AbstractCollection
从toString
覆盖Object
。
答案 4 :(得分:0)
List
和Collection
都是接口。方法toString()
在AbstractCollection
中被覆盖。
无论如何,比较对象的字符串表示是一种不好的做法。你应该使用
assertEquals(expectedList, actualList)
代替。
,其中
expectedList = Arrays.asList(new String[] {"String1", "String2", "String3"})
甚至更好的情况:
assertArrayEquals(expectedArray, actualArray)
请注意,您应该使用较新的org.junit.Assert
而不是junit.framework.Assert
。新实现有很多方法,包括数组比较实用程序。
答案 5 :(得分:-2)
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
直接覆盖