繁体   English   中英

java.util.List 上的 toString() 在哪里被覆盖

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

toString 被AbstractCollection覆盖,它是一个超类:

  • 抽象列表
  • 抽象队列
  • 抽象集
  • 数组队列

.asList返回的元素可能是AbstractList的子类

ListCollection都是接口。 方法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()的实现。 由于每个类都直接或间接地extendsObject ,如果一个特定的类没有定义 toString(),它会从层次结构中的父类继承。

根据UmNyobe评论更新

在层次结构中,将使用找到的第一个具有所需补充的父类。 在 OP 的问题中,该父类将是AbstractCollection ,它会覆盖Object中的toString

toStringArrayList覆盖, Arrays.asList()返回的List实现

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

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

其中ArrayListArrays的静态内部类:

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

是的,不是直接被ArrayList覆盖,而是被它的祖先AbstractList覆盖

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM