2

给定以下接口和实现类:

public interface MyInterface {
  public String getSomething ();
}

public class MyImplementation implements MyInterface {

   @Override
   public String getSomething () {
      return "Someting";
   } 

   public String getOtherThing () {
      return "otherThing";
   }
}

然后是一些客户端代码:

MyInterface objectViaMyInt = new MyImplementation();

objectViaMyInt.getSometing();   //WORKS, OF COURSE
objectViaMyInt.getOtherThing(); //DOESNT WORK, OF COURSE
objectViaMyInt.toString();      // WORKS TOO

所以,我想我理解这个的精神。..每个对象都是一个对象,应该继承那些基本方法。但这实际上是如何工作的?似乎它不能遵循继承和基于接口(类型)的访问的正常规则。. .

4

1 回答 1

11

但这实际上是如何工作的?

在语言级别上,它可以工作,因为JLS 第 9.2 节说它可以:

如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s、返回类型为 r 和 throws 子句的公共实例方法 m在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。

在 JVM 级别,JVM 可以只使用接口的每个实例显然必须是一个对象的知识,因此它可以以正常方式获得正确的成员实现。

于 2012-10-31T16:21:03.593 回答