所以我给出了以下代码,我应该找到代码将编译的情况:
VariableType var = new ObjectType();
var.doStuff();
如果(选择所有适用的选项)保证编译此代码:
我标记的唯一一个是第二个,虽然我真的不确定其他情况是否也有效。这个问题也没有答案,我有点难过。因此,如果你们中的任何一个人能解释每个案例以及他们为什么工作或不工作,那将会有很大帮助。
答案 0 :(得分:1)
当编译器看到方法调用时,它只关心调用该方法的变量或表达式的声明的类型。在这种情况下,变量为var
,其声明的类型为VariableType
。因此,只能调用在VariableType
或其超类型中声明的方法。
注意,赋值VariableType var = new ObjectType();
仅在ObjectType
是VariableType
的子类时编译,所以我想我们应该假设情况就是这样。但这并没有改变答案 - ObjectType
中声明的方法不是“VariableType
”。即使在ObjectType
的超类中声明了一个方法,也可能是该超类仍然是VariableType
的子类 - 例如,如果你有class FooType extends VariableType
和class ObjectType extends FooType
所有这一切的目的是确保编译的调用保证在运行时成功。如果我们允许var.methodThatOnlyExistsInObjectType()
进行编译,那么如果var
实际上没有引用ObjectType
,它将在运行时失败。
答案 1 :(得分:1)
首先,有一些未说明的要求。要编译此语句:
VariableType var = new ObjectType();
ObjectType
必须是具有合适构造函数的非抽象类VariableType
必须是类或接口,ObjectType
必须是VariableType
的直接或间接子类型。如果不满足任何这些要求,则上述语句将无法编译。
现在问你的问题。
如果doStuff()是VariableType 的成员函数,则[此代码保证编译]
真。编译器检查该方法是否存在于VariableType
提供的API中。它是。
如果doStuff()是ObjectType 的成员函数,则[此代码保证编译]
假。如果在doStuff()
中定义ObjectType
但在VariableType
中未定义,则调用将无法编译。
虽然在此示例中该方法将在运行时出现,但编译器要求方法调用适用于可以分配给var
的所有可能值。一些可能的值可能是VariableType
本身的实例,或VariableType
如果doStuff()是VariableType超类的成员函数,则[此代码保证编译]
真。在doStuff()
的超类中定义VariableType
时,它会由VariableType
继承,并且是该类API的一部分。
如果doStuff()是ObjectType的超类的成员函数,则[此代码保证编译]
假。考虑ObjectType
扩展A
和A
扩展VariableType
,VariableType
未定义doStuff
方法的情况。
在这种情况下,A
使用doStuff()
方法没有区别。该方法不会通过VariableType
API公开,因此无法像这样调用。