我试图查看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用于CollectionKV用于Map一样)。当您随后在Klant中使用它时,它将覆盖您的实际类MySet,并且由于其擦除为Object(如您未指定上限),因此您在Klant类中的类型为MySet的变量将仅请参见Object的方法。删除类型参数并使用

public class MySet {


你应该很好

10-04 09:51