Java 如何使用泛型对象列表迭代器中的方法调用另一个类';相等法

Java 如何使用泛型对象列表迭代器中的方法调用另一个类';相等法,java,list,object,compare,equals,Java,List,Object,Compare,Equals,我正在学习一门Java入门课程,我们正在学习如何制作一个通用对象列表迭代器(我称之为list),它可以在以后扩展到更具体的列表中。这样,如果我以后决定创建另一个list类,我可以扩展list而不是再次键入所有getter、setter、insert()、delete()等 我的教授希望我们的List类有一个isThere()方法。她希望它接受一个对象,遍历列表直到找到匹配项,然后返回找到它的位置的索引。我在这个网站上搜索过类似的问题,但大多数建议的方法都包括“”或hash,我们不允许在这个类中使

我正在学习一门Java入门课程,我们正在学习如何制作一个通用对象列表迭代器(我称之为list),它可以在以后扩展到更具体的列表中。这样,如果我以后决定创建另一个list类,我可以扩展list而不是再次键入所有getter、setter、insert()、delete()等

我的教授希望我们的List类有一个isThere()方法。她希望它接受一个对象,遍历列表直到找到匹配项,然后返回找到它的位置的索引。我在这个网站上搜索过类似的问题,但大多数建议的方法都包括“”或hash,我们不允许在这个类中使用它们。我们也不允许使用java为我们提供的任何数组方法。我们必须编写自己的方法

所以,我的问题是,我在我的对象列表中存储了10个用户。我特意将一个元素存储为“Bimmy”,以便使用我的isThere()方法尝试查找该元素。当我进入调试模式时,它显示它到达用户方法equals(),然后返回false。Debug还显示用户名都是“Bimmy”,id值也相同(具有相同名称和id的用户是equals方法返回true的要求)

这是我学Java的第一个学期,我想我的问题与铸造有关。我认为在列表的isThere()中,“List[I]”不知道它是一个用户,也不知道它应该将自己与另一个用户对象进行比较。然而,我真的不确定。如果有人愿意帮忙,我将不胜感激。我将在下面发布代码

List isThere()方法:

这就是我主要做的:

System.out.println("-----------------------------test isThere()");
    UserList check = new UserList(10);
    check.tryAdd(new User("Jimmy", "562801"));//I am adding 10 Users here.
    check.tryAdd(new User("Jimmy", "562801"));//I put one as "Bimmy" so that I can 
    check.tryAdd(new User("Jimmy", "562801"));//test this method to find that User
    check.tryAdd(new User("Jimmy", "562801"));//at index 8
    check.tryAdd(new User("Jimmy", "562801"));
    check.tryAdd(new User("Jimmy", "562801"));
    check.tryAdd(new User("Jimmy", "562801"));
    check.tryAdd(new User("Jimmy", "562801"));
    check.tryAdd(new User("Bimmy", "562801"));
    check.tryAdd(new User("Jimmy", "562801"));
    System.out.println(check.toString());


    System.out.println(check.isThere( new User("Bimmy","562801")));
此时未找到控制台输出-1,表示“Bimmy”。我不知道如何解决这个问题,但我期待着了解我做错了什么

以下是有关我的列表的更多信息:

protected final int MAXSIZE=10;
    protected Object [] list;
    protected int index;
    protected int curPos;

    public List()
    {
        list = new Object[MAXSIZE];
        for(int i = 0;i<MAXSIZE; i++)
        {
            list[i]=new Object();
        }
        index = 0;
        curPos = 0;
    }

    public List(int size)
    {
        list = new Object[size];
        for(int i = 0;i<size; i++)
        {
            list[i]=new Object();
        }
        index = 0;
        curPos = 0;
    }
还包括用户列表:

public UserList(int size){super(size);}

我相信它正在调用
对象.equals
方法(实际上只是检查它们是否是完全相同的对象)(每个对象都是
对象的子类)

这是因为你在打电话

list[i].equals(obj)
其中,
obj
的类型是
Object
(即使它的实际类型是
User

让您的
equals
方法覆盖
对象。equals应该可以:

@Override
public boolean equals(Object other)
{
    User user = (User)other;
    if(user.getName().equals(name) && user.getId().equals(id))
        return true;
    else
        return false;
}

另一种可行的方法是将
isThere
的输入参数的类型更改为
User
我相信它调用的是
对象.equals
方法(实际上只是检查它们是否是完全相同的对象)(每个对象都是
对象
的子类)

这是因为你在打电话

list[i].equals(obj)
其中,
obj
的类型是
Object
(即使它的实际类型是
User

让您的
equals
方法覆盖
对象。equals应该可以:

@Override
public boolean equals(Object other)
{
    User user = (User)other;
    if(user.getName().equals(name) && user.getId().equals(id))
        return true;
    else
        return false;
}

另一种可行的方法是将
isThere
的输入参数类型更改为
User

Java使用多态性,因此如果对象实际上是用户类型,它将调用用户的equals方法。你能说明你的
列表是什么以及它是如何填充的吗?好的,我刚刚编辑了关于列表的更多细节,以及它是如何添加新元素的。你应该做的一件事是将
@Override
添加到
equals
方法中。这将向您显示您实际上并没有重写
equals
,而是创建了一个新的
equals
方法。例如,如果我调用我创建的equals()方法,比如checkEquals(),我是否可以绕过Java,认为我正在尝试调用Object equals()方法?是的。您之前所做的是方法重载(相同的方法名称,不同的参数)——本质上是生成另一个您从未调用过的方法。现在您正在覆盖它(为超类的方法提供您自己的实现)。Java使用多态性,因此如果对象实际上是用户类型,它将调用用户的equals方法。你能说明你的
列表是什么以及它是如何填充的吗?好的,我刚刚编辑了关于列表的更多细节,以及它是如何添加新元素的。你应该做的一件事是将
@Override
添加到
equals
方法中。这将向您显示您实际上并没有重写
equals
,而是创建了一个新的
equals
方法。例如,如果我调用我创建的equals()方法,比如checkEquals(),我是否可以绕过Java,认为我正在尝试调用Object equals()方法?是的。您之前所做的是方法重载(相同的方法名称,不同的参数)——本质上是生成另一个您从未调用过的方法。现在您正在覆盖它(为超类的方法提供您自己的实现)。我刚刚尝试了您的建议,它非常有效。我唯一需要更改的是将对象“other”强制转换为(用户)而不是(对象)。它会给我一个错误,我不能从对象转换到用户。非常感谢你们的帮助。我不知道修复会这么简单。我只是尝试了你的建议,效果很好。我唯一需要更改的是将对象“other”强制转换为(用户)而不是(对象)。它会给我一个错误,我不能从对象转换到用户。非常感谢你们的帮助。我不知道修复会这么简单。
@Override
public boolean equals(Object other)
{
    User user = (User)other;
    if(user.getName().equals(name) && user.getId().equals(id))
        return true;
    else
        return false;
}