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