为什么不在某些父类上选择子类类型参数的重载

时间:2016-07-21 10:51:22

标签: java

while

我希望var guess = prompt("Enter A Value Guessing Between 1 to 10 !"), guessint = parseInt(guess, 10), random = Math.floor(Math.random() * 10) + 1; while (guessint !== random) { if (guessint > random) { guessint = parseInt(prompt("Try Again with value LESSER than " + guessint), 10); } else { guessint = parseInt(prompt("Try Again With Valur GREATER than " + guessint), 10); } } document.write("Guessed Correct");被选为public class Imp1 implements Inter1 { private int num; @Override public void apply() { num++; } public void doubler() { num = num * 2; } public boolean equals(Imp1 o) { if (!(o instanceof Imp1)) return false; return o.num == num; } public int getNum() { return num; } public static void main(String[] args) { final Inter1 a = new Imp1(); final Imp1 b = new Imp1(); a.apply(); b.apply(); System.out.println("a equals b " + a.equals(b)); System.out.println("b equals a " + b.equals(a)); } } equals(Imp1 o)的最佳候选人。为什么不是这里的情况?

更多细节 - 此代码输出两次错误,我想知道为什么? a和b保存Imp1对象,因此调用与Imp1实例的equals作为param应调用a.equals(b),这比b.equals(a)更合适,但我看到equals(Imp1 o)被调用,最后代码打印假两次而不是两次真。

2 个答案:

答案 0 :(得分:2)

方法重载分辨率由参数的编译时类型决定,因为编译器在编译时选择最佳匹配方法签名。

只有在传递给方法的参数的编译时类型为equals(Imp1 o)或子类Imp1时,才能选择

Imp1

a不符合此条件,因此b.equals(a)会调用Object的{​​{1}}。

对于equals,由于编译时类型a.equals(b)不是a,因此无法调用Imp1方法(除非您将其强制转换为equals(Imp1 o) 1}}),因此它只能选择Impl1的{​​{1}}。

Object

将致电equals

答案 1 :(得分:0)

问题是你没有真正覆盖Object超类的等号!!

这是执行此操作的正确方法:

public class Imp1 implements Inter1 {
private int num;

@Override
public void apply() {
    num++;
}

public void doubler() {
    num = num * 2;
}

@Override//<-----need to override the equals of the superClass Object!!!
public boolean equals(Object o) {//<---must be Object!!!
    if (!(o instanceof Imp1))
        return false;
    return ((Imp1)o).num == num;
}

public int getNum() {
    return num;
}

public static void main(String[] args) {
    final Inter1 a = new Imp1();
    final Imp1 b = new Imp1();
    a.apply();
    b.apply();
    System.out.println("a equals b " + a.equals(b));
    System.out.println("b equals a " + b.equals(a));
}

}

OR:

public class Imp1 implements Inter1 {
    private int num;

    @Override
    public void apply() {
        num++;
    }

    public void doubler() {
        num = num * 2;
    }

    @Override  //<---------------need to be implemented from the interface!
    public boolean equals(Inter1 o) {//<----the class must to be from the specific interface!!! 
        if (!(o instanceof Imp1))
            return false;
        return ((Imp1)o).num == num;//<-----must to cast the object to the specific object in the "if"
    }

    public int getNum() {
        return num;
    }

    public static void main(String[] args) {
        final Inter1 a = new Imp1();
        final Imp1 b = new Imp1();
        a.apply();
        b.apply();
        System.out.println("a equals b " + a.equals(b));
        System.out.println("b equals a " + b.equals(a));
    }

}