在我的代码中,我已经看到接口的瞬间和实现它的类的瞬间之间的区别,为什么?
我有返回类的对象数组并实现一个接口的方法,该方法声明了此方法,当创建类的即时实例并调用此方法时,如果接口即时调用了返回值,则返回的值是不同的,尽管它应该执行相同的工作,但是返回价值不同,为什么?

public interface A{
    public B[] m();
}

public class B implements A {

    public B[] m() {
        B b[]=new B[10];

        for(int i=0; i>10; i++)
            b[i]=new B();

        return b;
    }
}


在这一部分中,当我尝试为类创建两个即时实例,为接口创建另一个即时实例,然后为每个实例调用方法时,如下所示:

B obj1=new B();
A obj2=new B();

System.out.println(obj1.m().equals(obj2.m));
System.out.println( obj1.m()[0].equals(obj2.m()[0]) );
........


这返回假。

也许很清楚obj1不是obj2,但是为什么返回值不同?如果可能,如何获得相同的返回值?

最佳答案

代码的行为与obj1B)与obj2A)的编译时类型无关。

比较返回false的原因:


比较数组将始终为两个不同的数组返回false,因为数组不会覆盖Objectequals方法。
比较这两个数组的第一个元素还会返回false,因为您的B类没有覆盖equals方法,因此自obj1.m()[0].equals(obj2.m()[0])以来,obj1.m()[0] != obj2.m()[0]为false。如果您的B类将具有可能返回true的public boolean equals (Object other)实现,则它只能返回true。

10-08 07:07