簡體   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