HashSet的迭代器的问题

JBo*_*Boy 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且通过组合的类使用a 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.);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是在方法toon() 基本上即使我指定的迭代器将包含Klant对象<Klant> 的本地k对象不向我提供的getKlantNummer()定义mthod Klantk对象还是它的Object,甚至用它铸造例如:

Object k = (Klant)i.next();
Run Code Online (Sandbox Code Playgroud)

它不会起作用.堕落是危险的,但据我记得,这是不被禁止的.

有什么建议?

Mar*_*ers 9

在你的课程定义中,你有

public class MySet<Klant> {
Run Code Online (Sandbox Code Playgroud)

Klant被解释为你的类的类型参数(就像ECollectionKVMap).Klant当你随后在其中使用它时,它会覆盖你的实际类MySet,并且由于它的擦除Object(如你指定的没有上限),Klant你的MySet类中的类型变量只会看到Object方法.删除类型参数并使用

public class MySet {
Run Code Online (Sandbox Code Playgroud)

你应该好.