如何用字符串数组覆盖Class的equals()?

时间:2013-01-04 10:49:19

标签: java

我需要澄清Object等于方法中的String []比较。 下面是我的代码快照。当我执行此代码时,它给出true和false而不是true和true。 同样在我的情况下,Task类为每个调用生成唯一的id。 我究竟做错了什么?任何建议将不胜感激。

public class JobTask extends Task {

    String[] args;

    public WFTask(String[] args) {
        this.args = args;
    }
    @Override
    public boolean equals(Object obj) {        
            if (! ( obj instanceof String[] ) ){
            return false;           
            }
            String[]  arguments = (String[] ) obj;
            boolean ret = Arrays.equals(this.args , arguments );
            return ret;
    }
    @Override
    public void execute(TaskExecutionContext context) throws RuntimeException {
            --------------
            --------------
    }
    public static void main(String[] args) {
            String[] arg1 = {"a","b","c"};
            String[] arg2 = {"a","b","c"};
            System.out.println( Arrays.equals(arg1,arg2));
            JobTask t1 = new JobTask(arg1);
            JobTask t2 = new JobTask(arg2);
            System.out.println( t1.equals(t2));
    }
}

public abstract class Task {
    private Object id = GUIDGenerator.generate();
    public Task() {
    }
    Object getId() {
       return id;
    }
    public abstract void execute(TaskExecutionContext context)                  throws RuntimeException;
}

3 个答案:

答案 0 :(得分:3)

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        JobTask other = (JobTask)obj;
        if (!Arrays.equals(args, other.args))
            return false;
        return true;
    }

答案 1 :(得分:3)

您可以在调试器,提示,提示中看到这一点,但

您正在测试

System.out.println( t1.equals(t2));

但是你写了

    if (! ( obj instanceof String[] ) ){
        return false;           
        }

由于t2不是String[],因此返回false。我怀疑你打算写

    if (!(obj instanceof JobTask))
        return false;           

    JobTask other= (JobTask ) obj;
    return Arrays.equals(this.args , other.args);

答案 2 :(得分:1)

您的equals方法会收到JobTask,而不是String[]。你需要像这样重写它,例如:

@Override
public boolean equals(Object obj) {
    if (! ( obj instanceof JobTask ) ){
        return false;
    }
    String[]  arguments = ((JobTask) obj).args;
    boolean ret = Arrays.equals(this.args , arguments );
    return ret;
}
相关问题