проблема с итератором HashSet - PullRequest
1 голос
/ 04 июня 2011

Я пытаюсь понять, будет ли 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() mthod, определенный в Klant Объект k все еще является экземпляром Object, и даже приведениемэто с:

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

это не будет работать.Снижение рейтинга опасно, но, насколько я помню, это не запрещено.

Любой совет?

1 Ответ

9 голосов
/ 04 июня 2011

В вашем определении класса у вас есть

public class MySet<Klant> {

То, что Klant интерпретируется как параметр типа для вашего класса (точно так же, как E для Collection или K и V для Map). Он переопределяет ваш фактический класс Klant, когда вы впоследствии используете его в MySet, и поскольку его стирание равно Object (поскольку вы не указали верхнюю границу), переменная типа Klant в вашем классе MySet см. Object методы. Удалите параметр типа и используйте

public class MySet {

и тебе должно быть хорошо.

...