为什么我的 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>
.
无论如何,使用继承或组合。
但不能同时进行。
我有一个简单的 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>
.
无论如何,使用继承或组合。
但不能同时进行。