考虑以下语句:假设类A实现接口T.如果将类型A的对象传递给需要类型为T的参数的方法,则代码将编译,但Java将引发运行时异常。
我认为这是假的。接口的行为与Abstract类不同,因此类型A的对象是类型T的子类(或者接口没有类型?)。如果这是真的,那么是否可以在类型A的对象上使用期望类型为T的方法?另外,我的假设是任何期望超类对象(例如T)的方法都适用于所有子类(A和A的子类)?
像
public class A implements T {}
public void method(T obj) { do stuff to obj}
A objA = new A();
method(objA);
OUTPUT: do stuff to objA // no crashing or runtime exceptions
答案 0 :(得分:2)
如果MyClass实现了MyInterface,那么对MyClass的引用或从MyClass派生的任何类型也是对该接口的引用。当转换为接口类型时,使用该接口的任何成员将导致相应的MyClass成员用于MyClass的实例(或从其派生的类型)。这些事实意味着在大多数情况下,当给出对MyClass的引用时,期望MyInterface的代码将按预期工作,但这并不总是100%为真。一些接口包括“可选”功能,该功能在一些但不是所有实现类中实现。例如,不可变键值映射类可能实现Map接口但不支持put
方法。如果给出对不允许此类功能的对象的引用,则期望向传入的Map添加值的方法将失败。