Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中编写重载函数_Java_Overloading - Fatal编程技术网

如何在java中编写重载函数

如何在java中编写重载函数,java,overloading,Java,Overloading,我想知道让以下重载函数工作缺少什么 e、 g List=。。。; for(对象元素:列表) 乐趣(元素); 公共void Fun(整数元素){…} 公共void Fun(字符串元素){…} 公共void Fun(MyClass元素){…} Java使用——编译器根据参数类型在重载方法中进行选择,然后在运行时,JVM根据运行时类型this在方法的实现(重写)中进行选择 您提供了多个重载,但Java不会自动在它们之间切换。它查找可以接受(对象元素)的重载,但未找到任何重载,因此编译器拒绝您的程序 解

我想知道让以下重载函数工作缺少什么

e、 g

List=。。。;
for(对象元素:列表)
乐趣(元素);
公共void Fun(整数元素){…}
公共void Fun(字符串元素){…}
公共void Fun(MyClass元素){…}
Java使用——编译器根据参数类型在重载方法中进行选择,然后在运行时,JVM根据运行时类型this在方法的实现(重写)中进行选择

您提供了多个重载,但Java不会自动在它们之间切换。它查找可以接受
(对象元素)
的重载,但未找到任何重载,因此编译器拒绝您的程序

解决此问题的一种方法是使用运行时分派方法:

public void Fun(Object element) {
  if (element instanceof Integer) { Fun((Integer) element); }
  ...
}
这是因为它的静态类型是非常通用的,它使用一个类型更具体的参数类型调用
Fun
,因此被分派到不同的重载

频繁使用
instanceof
通常被认为是一种反模式。

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

注意第3行中的铸造。我还建议您遵循Java命名约定:
someMethodName
用于函数,而
SomeClassName
用于类。

添加用于标识对象类型的逻辑并对其进行类型转换。然后代码将按照您的预期工作

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) { ... }
List=。。。;
for(对象元素:列表)
//使用的实例将元素强制转换为类型之一(整数、字符串或MyClass)
乐趣(元素);
公共void Fun(整数元素){…}
公共void Fun(字符串元素){…}
公共void Fun(MyClass元素){…}

你可以做类似的事情

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);

}
下面是关于重载的说明

调用方法时(§15.12),实际参数的数量(和 任何显式类型参数)和的编译时类型 参数在编译时用于确定 将被调用的方法(§15.12.2)。

您试图用作方法参数的引用被声明为类型
对象
,但您没有接受
对象
参数的重载方法


你必须重新考虑你的设计

元素
未声明为这些类型中的任何一种。重载是一个编译时的概念。那么如何获得运行时重载呢?根本没有这回事。再看一遍。@user1589188你到底想做什么?@Kon我想编译上面的代码,根据不同的列表,相应的乐趣将使用泛型for循环运行,谢谢。是的,谢谢,我明白了。我只是希望这些instanceof可以由jvm在运行时根据Object元素的实际实例隐式完成,而不是使用分派方法显式完成。是的,谢谢,我完全理解这是可以做到的。实际上这是我的原始代码。我只是在想是否可以删除这些instanceof,因为显然jvm知道Object obj的实际实例,最好能自动为我调用适当的重载函数。是的,当然。我来自那个代码,希望能进一步简化它。
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);

}