【发布时间】:2014-09-15 01:38:42
【问题描述】:
我已经知道 Java 基于编译时类型调度方法。但是我有一个案例,我希望它可以工作,但它没有。
考虑这个简单的例子:
class Foo{
void bar(Object... objects) { //do something }
void bar(Map<String, Object> map) { //do something else }
}
和调用代码:
Foo foo = new Foo();
HashMap<String, T> map = createSomeHashMap(); //wil generate HashMap
foo.bar(map);
为什么 Java 认为调用 bar(Object... objects) 最合适?
因为我在编译时有一个地图,所以一切都应该工作!为什么我必须像foo.bar((Map<String, Object>)map); 一样明确地贬低它??
【问题讨论】:
-
Java 不会动态地(在运行时)分派参数。方法签名的选择完全在编译期间发生。不,选择没有“损坏”:它由 JLS 明确定义。
-
他确实说过“编译时类型”。 ;) 我认为他至少有一点是对的。
-
@markspace 完全正确!我什至不要求“运行时调度”!我觉得 user28... 甚至不阅读我的问题,而只是阅读主题(我承认我有一个错误)
标签: java parameters overloading dispatch method-dispatch