为什么我的 LinkedHashSet 在 toString() 方法中是空的?

Why is my LinkedHashSet empty within the toString() method?

我有一个简单的 class 扩展 LinkedHashSet 并试图覆盖 toString() 方法。我在 main 方法中向 Set 添加了一些元素,但是在我的 toString 方法中,Set 是空的。代码:

import java.util.*;
import java.util.*;

public class MyHashSet<T> extends LinkedHashSet<T>{
    private Set <T> myHashSet;


    public MyHashSet (){
        myHashSet = new HashSet<T>(5);
    }

    @Override
    public String toString(){
         if (myHashSet.isEmpty())
            return "This MyHashSet is empty.";
         else
            return myHashSet.toString();
    }

    public static void main (String[] args){
         MyHashSet <String> myHashSet = new MyHashSet<>();

         myHashSet.add("A");
         myHashSet.add("B");
         myHashSet.add("C");
         myHashSet.add("D");
         myHashSet.add("E");

         System.out.println(myHashSet);

         System.out.println(myHashSet.isEmpty());
    }
}

return如下:

This MyHashSet is empty.
false

我期待 toString() 而不是 return

[A, B, C, D, E]

我做错了什么?提前致谢。

简单:因为您没有内部地图添加您在class中作为字段的任何元素.

这里是:

myHashSet.add("A");

将元素添加到您的 class 继承.

的 "set" 结构

为了使用那个 internal 集,您还必须 @Override 各种 add() 方法。

但请注意:您应该或者使用组合(使用内部myHashSet字段)- 继承(然后您首先不需要这样的字段)。

您正在组合 两个不应以这种方式组合的 概念!

除此之外:您有两个名为 myHashSet 的东西 - 这相当令人困惑。避免以这种方式重复使用名称!

toString() 方法依赖于您声明的 myHashSet 字段,但您没有在 .

中添加元素

确实如此:

     MyHashSet <String> myHashSet = new MyHashSet<>();

     myHashSet.add("A");
     myHashSet.add("B");
     myHashSet.add("C");
     myHashSet.add("D");
     myHashSet.add("E");

您可以依靠 class 继承自的 LinkedHashSet 实现来添加元素。而且它当然不会使用你的字段。

事实上,如果你扩展 LinkedHashSet,你甚至不需要声明 myHashSet
因此,只需更改 toString() 方法以依赖于您继承自的 class :

@Override
public String toString(){
     if (isEmpty())
        return "This MyHashSet is empty.";
     else
        return super.toString();
}

否则,您也可以通过依赖 myHashSet 字段来使用组合,但您不应扩展 LinkedHashSet,而应实现 Set<E>.

无论如何,使用继承或组合。
但不能同时进行。