我一直在查看一些生产代码,我对使用接口作为类型(对象)的概念感到有点困惑
我看到了这个解释http://download.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html
以下是代码:
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ( (obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}
Relatable
是一个界面,我不明白它在哪里获得isLargerThan(obj2)
函数调用的逻辑。
有人可以为我说清楚吗?
答案 0 :(得分:8)
逻辑来自实现接口的类。这正是您无法直接实例化接口的原因,因为接口本身不包含任何实现。该语言确保传递给您的方法的对象是一个实现接口中方法的具体类。
答案 1 :(得分:2)
假设对象实际上是实现接口的类型;否则,你在施法时会得到ClassCastException
。
答案 2 :(得分:2)
虽然编译时类型obj1
是Relatable
,但运行时类型是实现Relatable
的一些具体类。实际调用的代码由该运行时类型定义。这称为dynamic dispatch。