我试图查看HashSet是否将是我下一个项目的解决方案,所以我正在做一些非常简单的测试来检查功能。
我有一个简单的课程Klant
:
public class Klant {
private int klantNummer;
public Klant(int nummer) {
this.klantNummer = nummer;
}
public int getKlantNummer() {
return this.klantNummer;
}
}
具有直通组成的类使用
HashSet
public class MySet<Klant> {
private Collection<Klant> mySet = null;
public MySet() {
mySet=new HashSet<Klant>();
}
public void add(Klant elem) {
mySet.add(elem);
}
public void toon() {
Iterator<Klant> i = mySet.iterator();
while(i.hasNext()) {
Klant k = i.next();
System.out.println(k.);
}
}
}
问题出在方法
toon()
基本上,即使我指定迭代器将包含Klant对象
<Klant>
本地
k
对象不向我提供getKlantNummer()
中定义的Klant
方法k
对象仍然是Object
实例,甚至可以通过以下方式强制转换:Object k = (Klant)i.next();
它不会工作。
下投是危险的,但据我所知,这是不被禁止的。
有什么建议吗?
最佳答案
在您的班级定义中,
public class MySet<Klant> {
该
Klant
被解释为您的类的类型参数(就像E
用于Collection
或K
和V
用于Map
一样)。当您随后在Klant
中使用它时,它将覆盖您的实际类MySet
,并且由于其擦除为Object
(如您未指定上限),因此您在Klant
类中的类型为MySet
的变量将仅请参见Object
的方法。删除类型参数并使用public class MySet {
你应该很好