【发布时间】:2021-01-22 13:10:33
【问题描述】:
Collection<Integer> list = new ArrayList<>();
list.add(0);
list.add(1);
list.add(2);
for (int i = 0; i < 3; i++) {
list.remove(i);
}
System.out.println(list);
}
}
我的问题: 为什么列表使用 remove(object o) 而不是 ArrayList.remove(int index)。我想在编译时,列出实际对象(动态类型)(Arraylist 的方法)而不是超类的方法。
【问题讨论】:
-
这会执行
remove(Object),因为您的list变量是Collection类型,而Collection没有指定remove(int index)方法。编译器只查看变量(Collection)的编译类型,而不是对象(ArrayList)的运行时类型。 -
你自己没有注意到你的期望(编译时间和动态类型)的矛盾吗?抛开在编译时使用动态(又名运行时)类型的技术问题:当编程语言总是使用运行时类型时,编译时变量类型的目的是什么?
标签: java inheritance collections interface