HashSet的迭代器的问题

时间:2011-06-04 05:44:52

标签: java generics iterator hashset downcast

我正在试图看看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();

它不起作用。 向下投射是危险的,但据我记得,这是不被禁止的。

有什么建议吗?

1 个答案:

答案 0 :(得分:9)

在班级定义中,您有

public class MySet<Klant> {

Klant被解释为您班级的类型参数(就像ECollectionK V一样Map 1}})。当您随后在Klant内使用它时,它会覆盖您的实际类MySet,并且因为它的删除是Object(因为您没有指定上限),所以Klant类型的变量在MySet课程中,只会看到Object的方法。删除type参数并使用

public class MySet {

你应该好。