1

Object の equal メソッド内の String[] 比較について明確にする必要があります。以下は私のコードのスナップショットです。このコードを実行すると、true と true ではなく true と false が返されます。また、私の場合、 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;
}
4

3 に答える 3

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;
    }
于 2013-01-04T10:51:19.207 に答える
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);
于 2013-01-04T10:52:32.487 に答える
1

メソッドはではなくequalsを受け取ります。たとえば、次のように書き換える必要があります。JobTaskString[]

@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;
}
于 2013-01-04T10:52:45.953 に答える