Java 函数重载
我想知道你是否可以在这里提出一些建议 我想有两种方法:Java 函数重载,java,overloading,Java,Overloading,我想知道你是否可以在这里提出一些建议 我想有两种方法: doSomething(List<Data>) and doSomething(List<Double>) doSomething(列表)和 剂量测定法(列表) 因为参数的类型是相同的,所以Java在抱怨 有什么方法可以使这种重载发生吗?泛型仅在编译时对编译器可用。它们不是执行时构造,因此上面的两种方法是相同的,因为在运行时,它们都是等效的。您可以做的一件事是添加一个伪参数,如下所示: doSomething(L
doSomething(List<Data>) and
doSomething(List<Double>)
doSomething(列表)和
剂量测定法(列表)
因为参数的类型是相同的,所以Java在抱怨
有什么方法可以使这种重载发生吗?泛型仅在编译时对编译器可用。它们不是执行时构造,因此上面的两种方法是相同的,因为在运行时,它们都是等效的。您可以做的一件事是添加一个伪参数,如下所示:
doSomething(List<Data>, Data)
doSomething(List<Double>, Double)
doSomething(列表、数据)
剂量测定法(列表,双倍)
很难看,但很管用
另一种选择是,您可以给这些方法取不同的名称。遗憾的是,没有。因为Java通过擦除实现泛型,所以这两个方法都可以编译为:
doSomething(List)
由于不能有两个具有相同签名的方法,因此不会编译
您所能做的就是:
doSomethingData(List<Data>)
doSomethingDouble(List<Double>)
doSomethingData(列表)
doSomethingDouble(列表)
或者是同样令人讨厌的东西。公开作废的东西(列表){
public void doSomething(List list) {
if(list.size() > 0) {
Object obj = list.get(0);
if(obj instanceof Data) {
doSomethingData((List<Data>)list);
} else if (obj instanceof Double) {
doSomethingDouble((List<Double>)list);
}
}
}
如果(list.size()>0){
Object obj=list.get(0);
if(obj数据实例){
doSomethingData((列表)列表);
}else if(双精度的obj实例){
doSomethingDouble((列表)列表);
}
}
}
为什么不换个名字呢:
doSomethingDouble(List<Double> doubles);
doSomethingData(List<Data> data);
doSomethingDouble(列表双倍);
doSomethingData(列表数据);
由于重载方法的解析发生在编译时而不是运行时,因此在原始(期望的)示例中,只要代码中引用了其中一个方法,就可能知道列表元素的类型。因此,前面提到的重载方法名而支持不同的方法名并没有那么大的代价。@Bobby Eikhoff这确实是一个编译时问题。这意味着它可以在没有擦除的情况下实现,所以答案是胡说八道。@Tom Hawtin-实现的“没有擦除”?也许你的意思是没有泛型?@Bobby Eikhoff,“没有具体化”/“不考虑擦除”。@Tom:呃……这不是胡说,它回答了OPs的问题“有没有办法让这种过载发生?”。没有办法完全满足OP的要求,但这是一个合适的解决方法。Java并没有像您在编译时所说的那样聪明。也许它应该,也许它不应该,事实上它不是。它可以通过保持擦除来实现-这是编译时的问题。过载解决不是运行时的问题!小心这种不安全的方法。您不能假设给定(原始)列表中每个元素的类型都与第一个元素的类型相同,这就是为什么编译器会抱怨强制转换不安全的原因。没错,但这种方法显然不适用于Data或Double以外的类型,因此,我认为可以安全地假设它的使用是相当有限的。我想他正在寻找一个快速的替代方案。为了更彻底,您需要检查列表中所有项目的类型,但为了“更安全”,这样做效率极低。最好插入一两行注释,表明它需要类型数据列表或双精度列表。如果精度如此重要,你会创建doSomethingData和doSomethingDouble。@Tom:在你的评论中,你会说“可以实现保留擦除”,但我不确定你的意思。你是说我们可以用现有的Sun编译器以这种方式重载方法,还是说编译器可以修复以允许这种情况?如果是前者,你能解释一下吗?如果你能向我们展示我们都非常感激的话,那么能够做到这一点就太好了。