HashSet 迭代器的问题

发布于 2024-11-13 08:08:13 字数 1147 浏览 4 评论 0原文

我正在尝试查看 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 对象 本地 k 对象没有为我提供 Klant 中定义的 getKlantNummer() 方法 k 对象仍然是一个 Object 实例,即使通过使用以下方式进行转换:

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

它也不起作用。 向下转换是危险的,但据我记得它并没有被禁止。

有什么建议吗?

I'm trying to see if HashSet would be the solution for my next project so i'm doing some very easy test to check functionalities.
I have a simple class Klant:

public class Klant {
    private int klantNummer;

    public Klant(int nummer) {
        this.klantNummer = nummer;
    }

    public int getKlantNummer() {
        return this.klantNummer;
    }
}

and a class with through composition uses 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.);
        }
    }
}

The problem is in the method toon()
Basically even though i specify that the Iterator will contain Klant objects <Klant>
The local k object does not provide me with the getKlantNummer() mthod defined in Klant
The k object its still an Object instance, and even by casting it with:

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

it won't work.
Down-casting is dangerous, but as far as i remember it is not prohibited.

Any advice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失去的东西太少 2024-11-20 08:08:13

在类定义中,

public class MySet<Klant> {

Klant 被解释为类的类型参数(就像 E 代表 CollectionKV 用于地图)。当您随后在 MySet 中使用它时,它会覆盖您的实际类 Klant,并且因为它的擦除是 Object (因为您没有指定上限) MySet 类中 Klant 类型的变量只能看到 Object 的方法。删除类型参数并使用

public class MySet {

,你应该会很好。

In your class definition, you have

public class MySet<Klant> {

That Klant is being interpreted as a type parameter for your class (just like E is for Collection or K and V are for Map). It is overriding your actual class Klant when you subsequently use it within MySet, and since its erasure is Object (as you specified no upper bound) a variable of type Klant within your MySet class will only see Object's methods. Remove the type parameter and use

public class MySet {

and you should be good.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文