Java Bug使用varargs的模糊方法?

use*_*827 12 java compiler-construction variadic-functions ambiguous

我有一个类有两个这样的方法:

public class Dummy{
  public void doIt(String arg1, File arg2, Writer... ctx){
    // Do something very important...
  }

  public void doIt(String arg1, Writer... ctx){
    // Do something else...
  }

  public static void main(String[] args){
    new Dummy().doIt("Test", null);
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望,编译器会给出错误,因为方法调用是不明确的.而是调用第二种方法.

在我们的例子中,ambigous方法是从数据库方法和稍后添加的varargs生成的.现在我们不知道如何避免方法调用的问题,如示例中所示.

有没有其他人有这个问题,并有一个想法如何解决它?

小智 2

我按照这个给出答案:

问题是如何找到这样的方法调用,其中第一个方法应该被调用(并且是在我们更改代码生成器之前),但第二个方法被调用。

首先,正如已经指出的那样,Java 编译器会对此类方法的使用发出警告。它看起来像这样:

com/stack/undsprlbl/varargs/Main.java:10:警告:对最后一个参数的参数类型不精确的 varargs 方法进行非 varargs 调用;

并且可以很容易地grep从输出中进行 -ed javac

其次,您可以考虑按照以下方式为您的代码编写一些自测试:

    Class cl = Ambiguity.class;
    Method[] methods = cl.getDeclaredMethods();
    Set<String> varargsMethods = new HashSet<String>();
    for (Method method : methods) {
        Class c[] = method.getParameterTypes();
        if(c.length > 0)
        {
            Class last = c[c.length - 1];
            if(last.isArray())
            {
                if(varargsMethods.contains(method.getName()))
                    System.out.println("Method " + cl.getName() + "#"+ method.getName() + " looks suspicious.");
                else
                    varargsMethods.add(method.getName());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

了解您应该迭代所有类而不是直接提及。这个答案似乎是一种方法——获取应用程序中的所有包并检查它们。

此时您将有两个列表:

  1. 不明确的可变参数方法用法列表

  2. 不明确的可变参数方法列表。

通过交叉这两者,您可以找出可能会出现问题的地方。

接下来,我建议检查添加第二个方法之前的代码版本,并找到第一个方法的所有用法。显然必须消除这些歧义,以支持 HEAD 版本中的第一种方法。我想,这样一来,剩下的呼叫数量就会相当有限。