Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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,我想知道你是否可以在这里提出一些建议 我想有两种方法: 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编译器以这种方式重载方法,还是说编译器可以修复以允许这种情况?如果是前者,你能解释一下吗?如果你能向我们展示我们都非常感激的话,那么能够做到这一点就太好了。