我基于 TreeSet 创建了自己的 Collection,但我在现有测试中遇到了问题:它看不到元素

I made my own Collection based on TreeSet but I have troubles with existing test: it doesn't see elements

这是我的collection。在这里,我尝试使用特殊的 Comparator 实现我自己的实现,该 Comparator 按其绝对值对 Integer 元素进行排序。

class SortedByAbsoluteValueIntegerSet extends TreeSet {

private TreeSet<Integer> mySet;

public SortedByAbsoluteValueIntegerSet() {
    mySet = new TreeSet<Integer>(Comparator.comparing(Math::abs));
}

@Override
public boolean add(Object o) {
    mySet.add((Integer) o);
    return true;
}

@Override
public boolean addAll(Collection c) {
    for (Object o : c) {
        mySet.add((Integer) o);
    }
    return true;
}

public Iterator<Integer> iterator() {
    return mySet.iterator();
}

(和其他方法)

主要class。除了 toString() 方法之外,一切似乎都正常工作。当我在没有 lambda 的情况下覆盖此方法时,它会起作用。但!此方法正在测试中,我不能更改它。我只是将它复制到 Main class 以试图了解问题所在。我想解决的问题是 SortedByAbsoluteValueIntegerSet class.

中的某个地方
public static void main(String[] args) {

    Set<Integer> set = new SortedByAbsoluteValueIntegerSet();

    Arrays.asList(1, 3, 5, 7, 9).forEach(set::add);
    set.addAll(Arrays.asList(-2, -4, -6, -8, -10));

    System.out.println("set.size() = " + set.size());  //OUTPUT:"set.size() = 10"
    System.out.println("set = " + set);  //OUTPUT:"set = [-10, -8, -6, -4, -2, 1, 3, 5, 7, 9]"
    System.out.println("toString(set) = " + toString(set)); //OUTPUT:"toString(set) = "

}

private static String toString(final Collection<Integer> collection) {
    return String.join(" ", collection.stream()
            .map(i -> Integer.toString(i))
            .toArray(String[]::new));
}

这是另一个行之有效的认识。那有什么区别呢?

private static String toString(final Collection<Integer> collection) {
    List<String> list = new ArrayList<>();
    for (Integer i : collection) {
        String s = Integer.toString(i);
        list.add(s);
    }
    return String.join(" ", list.toArray(new String[0]));
}

您似乎还没有完全理解 toString() 方法。此方法应该在您的 SortedByAbsoluteValueIntegerSet 中 class 并且 必须 是 public 并且 不是 私有的。 也许这个 link 可以帮助您更好地理解 toString() 方法:
https://www.javatpoint.com/understanding-toString()-method

您不应该扩展具有 TreeSet 字段的 TreeSet 。一个或另一个,但两者都没有意义。

这可能实际上是导致您的问题的原因:您有两个不同的 TreeSet 与每个 SortedByAbsoluteValueIntegerSet 相关联,一个是您要添加的,另一个是 toString()越来越不一样了。

改为扩展 AbstractSet