在下面的代码中,为什么 o1.equals(o2); 调用 equals(Object o) 而不是 equals(EqualsTest et),即使 o1o2 正在引用 EqualsTest 类型的对象!

public class EqualsTest {
      public static <T> boolean equalTest(T o1, T o2) {
          return o1.equals(o2);
      }
      public static void main(String[] args) {
          EqualsTest et1 = new EqualsTest();
          EqualsTest et2 = new EqualsTest();
          System.out.println(et1.equals(et2));
          System.out.println(equalTest(et1, et2));
      }
      public boolean equals(Object o) {
          if (o instanceof EqualsTest) {
              System.out.println("equals(Object)");
              return true;
          }
          return false;
      }
      public boolean equals(EqualsTest et) {
          System.out.println("equals(EqualsTest)");
          return this.equals((Object)et);
      }
}

最佳答案

编译器根据 declared type of the argument 找到对应的方法,不是最具体的。由于您没有为 T 指定任何内容,因此它默认为 Object ,正如@nicholas.hauschild 正确指出的那样。

关于Java参数混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13237114/

10-12 17:57