我有一个扩展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]
我做错了什么?提前谢谢。
答案 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
的东西 - 这是相当令人困惑的。避免以这种方式重复使用名称!