Java - 重载方法接受参数的接口.调用哪种方法,为什么?

Krö*_*röw 1 java ambiguous

我有一个实现两个接口的对象(特别是Serializablejava.security.Key接口).该对象的类还有两个静态方法:一个接受一个Serializable对象,另一个接受一个Key对象.这是一些示例代码:

public class Subclass implements Serializable, java.security.Key{
   public static void test(Serializable s) {
      System.out.println("Ser");
   }
   public static void test(java.security.Key k) {
      System.out.println("Key");
   }

   public static void main(String[]args){
      test(new Subclass());
   }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行上面的main方法时,不会抛出任何错误,Java会调用该test(Key)方法.但是,当我将Serializable界面更改为其他内容(我更改其中的参数test(Serializable)并将其更改为超级界面Subclass)时,我的IDE会显示错误:

该方法test(Key)对于该类型是不明确的SubClass.

我想知道的是,为什么Java允许这种方法与Serializable界面模糊不清?

tka*_*usl 6

这个作品和原因test(java.security.Key k)被称为是因为java.security.Key扩展Serializable本身,因此java.security.Key更专业的Serializable,并首选方法调用.

  • https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5 (2认同)