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

时间:2017-08-13 18:42:50

标签: java tostring

我有一个扩展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());
    }
}

返回以下内容:

  

此MyHashSet为空。   
  假   

我希望toString()代替

  

[A,B,C,D,E]

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

2 个答案:

答案 0 :(得分:5)

toString()方法依赖于您声明的myHashSet字段,但您不会添加元素。

确实,这里:

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

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

您可以依赖于您的类继承的LinkedHashSet实现来添加元素。它当然不会使用你的领域。

事实上,如果您延长myHashSet,您甚至不需要声明LinkedHashSet
因此,只需将toString()方法更改为依赖于您继承的类:

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

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

无论如何,使用继承或组合 但不是两个在同一时间。

答案 1 :(得分:3)

简单:因为您将任何元素添加到您在班级中作为字段的内部地图。

这里:

myHashSet.add("A");

将元素添加到&#34; set&#34;您的班级继承的结构

要使用内部集,您还必须@Override各种add()方法。

但请注意:您应 使用合成(使用内部myHashSet字段) - 继承(然后您不需要首先是一个领域)。

您正在结合两个概念,不应该以这种方式合并!

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