我正在试图看看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()
中
基本上即使我指定Iterator将包含Klant对象<Klant>
本地k
对象未向我提供getKlantNummer()
中定义的Klant
方法
k
对象仍然是Object
实例,甚至可以通过以下方式进行转换:
Object k = (Klant)i.next();
它不起作用。 向下投射是危险的,但据我记得,这是不被禁止的。
有什么建议吗?
答案 0 :(得分:9)
在班级定义中,您有
public class MySet<Klant> {
Klant
被解释为您班级的类型参数(就像E
或Collection
或K
V
一样Map
1}})。当您随后在Klant
内使用它时,它会覆盖您的实际类MySet
,并且因为它的删除是Object
(因为您没有指定上限),所以Klant
类型的变量在MySet
课程中,只会看到Object
的方法。删除type参数并使用
public class MySet {
你应该好。