在java.util.List上覆盖toString()的位置

时间:2012-09-24 09:12:05

标签: java collections junit4

我想知道为什么这个断言在JUnit中起作用:

assertEquals("[String1, String2, String3]", Arrays.asList("String1", "String2", "String3").toString());

我看不到在List或Collection上的任何地方覆盖toString()。

我很高兴它有效,但仍然很好奇。

谢谢,Declan

6 个答案:

答案 0 :(得分:10)

Arrays.asList返回AbstractListAbstractCollection延伸{{1}} an Arrays#ArrayList

答案 1 :(得分:1)

toString被AbstractCollection覆盖,{{3}}是一个超类:

  • AbstractList的
  • AbstractQueue
  • AbstractSet
  • ArrayDeque

.asList返回的元素可能是AbstractList

的子类

答案 2 :(得分:1)

如果你需要asList代码(在asList上按 F3 转到eclipse中的声明是附加源代码)它返回

 return new ArrayList<T>(a);

进一步调查Arrays确实有toString重载。

答案 3 :(得分:0)

Object课程已实施toString()。由于每个类直接或间接extendsObject,如果某个特定类没有定义toString(),它将从层次结构中的父类继承。

更新基于UmNyobe评论:

在层次结构中,将使用找到具有所需实现的第一个父类。在OP的问题中,该父类将AbstractCollectiontoString覆盖Object

答案 4 :(得分:0)

ListCollection都是接口。方法toString()AbstractCollection中被覆盖。

无论如何,比较对象的字符串表示是一种不好的做法。你应该使用

assertEquals(expectedList, actualList)代替。

,其中

expectedList = Arrays.asList(new String[] {"String1", "String2", "String3"})

甚至更好的情况:

assertArrayEquals(expectedArray, actualArray)

请注意,您应该使用较新的org.junit.Assert而不是junit.framework.Assert。新实现有很多方法,包括数组比较实用程序。

答案 5 :(得分:-2)

<{>} toStringArrayList覆盖,List

返回Arrays.asList()实现

以下是asList类中Arrays方法的实现方式。

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

其中ArrayListArrays的静态内部类:

private static class ArrayList<E> extends AbstractList<E>

雅,ArrayList不是直接覆盖,而是由其祖先AbstractList直接覆盖