[英]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.