为了账号安全,请及时绑定邮箱和手机立即绑定

错误与varargs和重载?

错误与varargs和重载?

红糖糍粑 2019-11-20 14:52:45
Java varargs实现中似乎存在一个错误。当方法使用不同类型的vararg参数重载时,Java无法区分适当的类型。它给我一个错误 The method ... is ambiguous for the type ...考虑以下代码:public class Test{    public static void main(String[] args) throws Throwable    {        doit(new int[]{1, 2}); // <- no problem        doit(new double[]{1.2, 2.2}); // <- no problem        doit(1.2f, 2.2f); // <- no problem        doit(1.2d, 2.2d); // <- no problem        doit(1, 2); // <- The method doit(double[]) is ambiguous for the type Test    }    public static void doit(double... ds)    {        System.out.println("doubles");    }    public static void doit(int... is)    {        System.out.println("ints");    }}该文件说:“一般来说,你不应该重载可变参数的方法,或将难以程序员找出哪些超载被调用。”但是,他们没有提到此错误,发现困难的不是程序员,而是编译器。有什么想法吗?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

un论坛上对此进行了讨论。


那里没有真正的解决办法,只是辞职。


Varargs(以及自动装箱,这也导致难以遵循的行为,尤其是与varargs结合使用)已在Java的生命中被追上,这是它展示的一个领域。因此,与其说是编译器,不如说是规范中的错误。


至少,这为SCJP技巧提出了好(?)技巧问题。


查看完整回答
反对 回复 2019-11-20
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

有趣。幸运的是,有两种方法可以避免此问题:


您可以在方法签名中使用包装器类型:


   public static void doit(Double... ds) {

       for(Double currD : ds) {

          System.out.println(currD);

       }

    }


    public static void doit(Integer... is) {

       for(Integer currI : is) {

          System.out.println(currI);

       }

    }

或者,您可以使用泛型:


   public static <T> void doit(T... ts) {

      for(T currT : ts) {

         System.out.println(currT);

      }

   }


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 367 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信