English 中文(简体)
b 带有蒸气和超负荷;
原标题:bug with varargs and overloading?

看来,在Java vararg实施过程中出现了一种ug。 Java可以区分适当的类型,如果一种方法超负荷使用不同类型的蒸气参数。

它给我留下了一个错误的<代码>。 方法......对于......类型......含糊不清。

考虑以下法典:

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

说:“一般而言,你不应超负荷使用蒸气法,或方案人员难以估计超负荷可被称作”

然而,他们并未提及这一错误,而并非方案制定者认为这一错误是困难的,而是汇编者。

想法?

http://www.ohchr.org。 - Compiler: Sun jdk 1.6.0 u18

最佳回答

http://forums.sun.com/thread.jspa?threadID=5135517“rel=“noreferer”在太阳论坛上讨论。

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

Varargs(和汽车箱,也导致难以跟踪的行为,特别是结合弹 v)后来在Java的生活中被废除,这是它所显示的一个领域。 因此,它比汇编者更是pec。

至少,它使情况良好(?) SCJP 收集问题。

问题回答

问题在于,它不明确。

doIt(1, 2);

可打电话到do It(int ...),或doIt(double ...)。 在后一种情况下,将提升分类字面,使之达到<条码>杜布尔数值。

我确信, Java的幽灵说,这是一个模棱两可的构造,汇编者只是遵循了pec定的规则。 (我必须进一步研究这一点才能确定)。

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5“rel=” 选择最具体的方法,但造成我的头部受伤。

I think that the reasoning would be that void doIt(int[]) is not more specific (or vice versa) than void doIt(double[]) because int[] is not a subtype of double[] (and vice versa). Since the two overloads are equally specific, the call is ambiguous.

By contrast, void doItAgain(int) is more specific than void doItAgain(double) because int is a subtype of double according the the JLS. Hence, a call to doItAgain(42) is not ambiguous.

EDIT 2 - @finnw is right, it is a bug. 考虑15.12.2.5的这一部分(删除不适用案件):

一种称为m的变性成员方法是更为具体的,而不是另一种相同名称的变性成员方法:

一位成员的方法有没有参数,而另一成员则有k参数,即N ≥k。 第一种成员方法的参数类型为T1, ., Tn-1, Tn[],其他方法的参数类型为U1, ., Uk-1, Uk[]。 Let Si = Ui, 1<=i<=k。 然后:

  • for all j from 1 to k-1, Tj <: Sj, and,
  • for all j from k to n, Tj <: Sk

对于N = k = 1的情况,我们看到doIt(int[])doIt(double[])更为具体。


事实上,有bug report for this and 逊尼派承认,这确实是一种丑恶,尽管它们将其定为“非常低的”

利息。 幸运的是,避免这一问题有两种不同的方式:

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

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




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...