Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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,我想创建两个函数,比如 long min(long...); int min(int...); 但是当我尝试调用第二个,即min(1,5)one时,我得到了不明确的方法调用 除了重命名,还有其他解决方法吗?这些方法签名是唯一的,并且是有效的方法重载 问题必须在方法调用参数中。我猜您是在用一个文本调用该方法,如: min(100) 它不喜欢这样,因为100是一个整数,但它会自动转换为长字符 通过在长文本末尾使用L消除方法调用的歧义应该可以解决问题: min(100L) 此外,您还可以使用J

我想创建两个函数,比如

long min(long...);
int min(int...);
但是当我尝试调用第二个,即
min(1,5)
one时,我得到了不明确的方法调用


除了重命名,还有其他解决方法吗?

这些方法签名是唯一的,并且是有效的方法重载

问题必须在方法调用参数中。我猜您是在用一个文本调用该方法,如:

min(100) 
它不喜欢这样,因为100是一个整数,但它会自动转换为长字符

通过在长文本末尾使用L消除方法调用的歧义应该可以解决问题:

min(100L)
此外,您还可以使用Java对象整数和Long显式调用,并让自动装箱处理到基元类型的转换:

min(new Long(100))
min(new Integer(100))

问题是,当您使用
整数调用这些方法时,方法中的为参数提供精确匹配,就像您使用
变量args
一样。另外,
var args
都可以将用逗号分隔的
int
值作为参数。因此
方法不明确
错误

调用重载方法时,
编译器首先选择
精确匹配。然后选择要强制转换的
最近的类型

现在,由于
var args
只是一个
数组
,编译器在传递
整数
值时无法决定使用哪个数组。因此,两个数组都不能被视为
精确匹配
最近转换
。因此,它需要两个方法都符合调用条件

重载
的情况下,有更多关于
方法调用的规则。您可以从
Java语言规范
中学习这些内容



正如在Java 7中一样,这个问题已经被修复。但是它在Java版本<7中不起作用。

这是一个已知的错误

您描述的行为是一个已经用Java7修复的bug。请参阅“大多数特定Varargs方法选择中的更改”一节中的详细信息

它应该编译的原因

在确定最具体的方法时,变量算术排在最后。在中定义了确定当存在多个变量时应用哪个vararg方法的规则-以下是一个摘录:

一个名为m的变量arity成员方法比另一个同名的变量arity成员方法更具体,如果:
-[…]
-一个成员方法有k个参数,另一个有n个参数,其中n≥ k、 以及:

  • 第一种方法的参数类型为U1、…、Uk-1、Uk[]
  • 另一种方法的参数类型为T1、…、Tn-1、Tn[]
  • 对于从1到n的所有j,Uj试试这个

    public class Test {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            new Test().m(100L,512L);
            new Test().m(100,512);
        }
    
        int m(int... i) {
            System.out.println("int");
            return 0;
        }
    
        long m(long... i) {
            System.out.println("long");
            return 0;
        }
    }
    


    这是一条varg args,还是仅仅是一条
    消息?这是一条varg args,还是仅仅是一条
    消息?显示您如何调用第二条消息您正在使用的jdk?我使用JDK7运行得很好,但也无法在JDK7上复制。您是否考虑将OP发布的方法作为单参数方法?传递literal
    100
    仅在
    var args
    的情况下失败。否则就行了。编译器选择精确匹配。-1
    新整数(100)
    也没有帮助<代码>100
已经是一个整数+我也是
long…
的作用类似于
long[]
int[]
不能被强制转换为
long[]
,因此它不会更多specific@assylias.. 如果与var args一起使用,它将不会编译。我认为这就是OP面临的问题。他可能在int和lon上使用var args。@RohitJain看到我的答案了。比较不是在
int[]
long[]
之间,而是在
int
long
@assylias之间。。否。这里的决定是将
int
转换为
int[]
还是
long[]
。您的代码无法编译。请测试一下。@JanDvorak情况并非如此:
int[]
不比
long[]
更具体,但
int...
long...
更具体。。你试过编译它吗?它没有编译,至少对我来说是这样。@RohitJain我知道发生了什么。更新我的答案。@RohitJain这是Java@assylias中的一个bug。。那么,在这种情况下,OP没有必要使用Java7。在Java7之前,它当然不起作用。因此,我认为我的答案是正确的,不需要投反对票。顺便说一句,感谢您引用它在Java7中工作。到目前为止还没有度过难关。:)@亚西尔亚斯。。嗯,到现在为止我还没有用过Java7。所以,在你告诉我之前,我当然不可能知道这个bug修复。我知道这就是问题所在,所以我没有费心去寻找Java 7中的任何错误修复。@RiaD:它在jdk6中工作得很好。您正在使用哪个jdk?
public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Test().m(100L,512L);
        new Test().m(100,512);
    }

    int m(int... i) {
        System.out.println("int");
        return 0;
    }

    long m(long... i) {
        System.out.println("long");
        return 0;
    }
}