该维基百科指出:
由于在运行前(通常)不知道多态对象的具体类型,因此执行的函数是动态绑定的。以下面的 Java 代码为例:
public void foo(java.util.List<String> list) { list.add("bar"); }
List 是一个接口,所以 list 必须引用它的子类型。它是对 LinkedList、ArrayList 还是其他 List 子类型的引用?add 引用的实际方法直到运行时才知道。
考虑这个例子:
List<String> list;
list = new LinkedList<String>();
foo(list);
list = new ArrayList<String>();
foo(list);
为什么这里引用的实际方法直到运行时才知道?编译器不能只检查对象列表分配给哪种类型的 foo 的每个调用吗?当然,这只有在程序是确定性的并且不涉及随机性(例如用户交互)时才有可能。
这是引用声明中的(一般)是关于还是我的理解错误?
在程序是确定性的特殊情况下,是使用静态绑定还是 - 在 Java 中 - 总是使用动态绑定,不管有什么可能?如果是这样,为什么?