我想知道让以下重载函数工作的缺失是什么?
e.g。
List<?> list = ...;
for (Object element : list)
Fun(element);
public void Fun(Integer element) { ... }
public void Fun(String element) { ... }
public void Fun(MyClass element) { ... }
答案 0 :(得分:2)
Java使用double-dispatch - 编译器根据参数类型在重载方法中选择,稍后,在运行时,JVM根据{{1}的运行时类型选择方法的实现(覆盖) }。
您提供了多个重载,但Java不会自动在它们之间切换。它会查找可以接受this
的重载并找不到,因此编译器会拒绝您的程序。
解决此问题的一种方法是使用运行时调度方法:
(Object element)
这是有效的,因为它的静态类型非常通用,并且它使用参数类型调用public void Fun(Object element) {
if (element instanceof Integer) { Fun((Integer) element); }
...
}
,其类型更具体,因此被调度到不同的重载。
频繁使用Fun
通常被视为反模式。
答案 1 :(得分:2)
Fun(x)
x
Object
类型Fun(Object)
将尝试查找带有签名public void fun(Object obj) {
if (obj instanceof Integer)
((Integer) obj).someMethod(); // line 3
else if (obj instanceof String)
...
}
的函数,并且您从未声明过。{1}}。我想你想要这样的东西。
someMethodName
第3行 注意强制转换。我还建议您遵循Java命名约定:SomeClassName
表示函数,{{1}}表示类。
答案 2 :(得分:2)
添加逻辑以识别对象的类型并对其进行类型转换。然后代码将按预期工作。
List<?> list = ...;
for (Object element : list)
// Type cast element to one of the type (Integer, String or MyClass) using Instance of
Fun(element);
public void Fun(Integer element) { ... }
public void Fun(String element) { ... }
public void Fun(MyClass element) { ... }
答案 3 :(得分:2)
你可以做那样的事情
public void SuperFun(Object o){
if(o instanceof Integer)
Fun((Integer)o);
if(o instanceof String)
Fun((String)o);
if(o instanceof MyClass)
Fun((MyClass)o);
}
答案 4 :(得分:1)
Java Language Specification说明了有关重载的内容
调用方法时(第15.12节),实际参数的数量(和 任何显式类型参数)和的编译时类型 在编译时使用参数来确定签名 将被调用的方法(§15.12.2)。
您尝试用作方法参数的引用被声明为类型Object
,但您没有接受Object
参数的重载方法。
您必须重新考虑您的设计。