如何在java中编写重载函数

时间:2014-02-04 04:10:23

标签: java overloading

我想知道让以下重载函数工作的缺失是什么?

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) { ... }

5 个答案:

答案 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参数的重载方法。

您必须重新考虑您的设计。