проблема с итератором HashSet

Я пытаюсь понять, станет ли 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();

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

Любой совет?


person JBoy    schedule 04.06.2011    source источник
comment
Я рекомендую использовать for( Klant k : mySet )   -  person trutheality    schedule 04.06.2011
comment
Спасибо, Крис, так действительно лучше   -  person JBoy    schedule 05.06.2011


Ответы (1)


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

public class MySet<Klant> {

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

public class MySet {

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

person Mark Peters    schedule 04.06.2011