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

时间:2017-04-13 14:37:58

标签: 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());
   }

}

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

  

方法test(Key)对于SubClass类型不明确。

我想知道的是,为什么Java允许这种方法与Serializable接口有歧义而没有其他接口?

1 个答案:

答案 0 :(得分:6)

这可行的原因以及调用test(java.security.Key k)是因为java.security.Key扩展了Serializable本身,因此java.security.Key 比{{更>专业化而不是{{} 1}}并且是方法调用的首选。