2011-06-04 44 views
1

我试图看看HashSet是否是我下一个项目的解决方案,所以我正在做一些非常简单的测试来检查功能。 我有一个简单的类KlantHashSet的迭代器的问题

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物体没有为我提供在Klant中定义的getKlantNummer()方法 k反对其仍然是一个Object实例,甚至用它铸造:

Object k = (Klant)i.next(); 

将无法​​正常工作。 向下铸造是危险的,但据我记得它是不被禁止的。

有什么建议吗?

+1

我推荐使用'for(Klant k:mySet)' – trutheality 2011-06-04 06:05:40

+0

谢谢克里斯,多数民众赞成在 – JBoy 2011-06-05 11:05:43

回答

9

在你的类定义,你有

public class MySet<Klant> { 

Klant被解释为一个类型参数为你的类(就像ECollectionKVMap)。当您随后在MySet内使用它时,它将覆盖您的实际类Klant,并且由于其擦除次数为Object(因为您没有指定上限),因此MySet类中的Klant类型的变量将仅看到Object的方法。删除类型参数并使用

public class MySet { 

你应该很好。

+0

谢谢你马克,在3分钟内我会标记为解决 – JBoy 2011-06-04 05:53:38