Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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_Generics_Intellij Idea_Overloading - Fatal编程技术网

Java 有没有一种方法可以在不强制转换的情况下解决不明确的方法调用? 初始问题

Java 有没有一种方法可以在不强制转换的情况下解决不明确的方法调用? 初始问题,java,generics,intellij-idea,overloading,Java,Generics,Intellij Idea,Overloading,我有以下代码: public static void main(String[] args) throws Exception { test(new LinkedList()); } public static void test(Queue qeueue){ System.out.println("Queue"); } public static void test(List list){ System.out.println("List"); } InteliJ

我有以下代码:

public static void main(String[] args) throws Exception {
    test(new LinkedList());
}

public static void test(Queue qeueue){
    System.out.println("Queue");
}

public static void test(List list){
    System.out.println("List");
}
InteliJ不让我管理这个项目

  • 有没有办法解决这个问题
  • 如果两者在特定性上相同,JVM会使用哪一个?是随机的吗
  • 我读过相关的SO q/a,但没有人给出如何围绕它编译的答案。 他们只是列出原因

    更新 更糟糕的例子是:

    test(null);
    

    我一直在读一篇非常有趣的文章:

    一个
    链接列表
    一个
    列表
    和一个
    Deque
    ,而这又是一个
    队列

    因此,
    test
    方法调用对编译器来说是不明确的,因为无法确定要调用哪个重载

    合并方法以接受唯一对象(例如,
    集合
    ),或者显式强制转换为任一目标类型(或者,具有不同的方法名称)


    还请记住:不鼓励使用原始类型,您可能希望参数化您的泛型集合。

    A
    LinkedList
    既有
    列表
    又有
    Deque
    ,后者又是
    队列

    因此,
    test
    方法调用对编译器来说是不明确的,因为无法确定要调用哪个重载

    合并方法以接受唯一对象(例如,
    集合
    ),或者显式强制转换为任一目标类型(或者,具有不同的方法名称)


    还请记住:不鼓励使用原始类型,您可能希望参数化您的泛型集合。

    如果不按您所说的强制转换,则不可能。由于LinkedList实现了这两个接口,所以编译器不知道要链接哪个接口,因此给出了一个不明确的调用错误。一旦您对其进行强制转换,编译器就会了解其意图并相应地链接调用。

    如果不按照您所说的进行强制转换,则不可能。由于LinkedList实现了这两个接口,所以编译器不知道要链接哪个接口,因此给出了一个不明确的调用错误。一旦您强制转换它,编译器就会知道其意图并相应地链接调用。

    使用方法重载时,由编译器决定使用哪个方法。对于JVM,您的两个方法是完全不同的,就像它们有完全不同的名称一样。使用方法重写,这是不同的,然后由“点之前的对象”的运行时类决定,这就是JVM的工作

    因此,您必须与编译器打交道,帮助他选择正确的方法。编译器的静态类型分析必须明确排除这两种情况之一

    在代码中,编译器看到
    test(newlinkedlist())并推断LinkedList的静态类型。知道该类同时实现了
    列表
    队列
    ,他不能选择一种方法

    您不想像在
    test((List)newlinkedlist()中那样强制转换。那么您可能愿意接受的唯一变体就是引入一个明确类型的局部变量,例如

    List arg = new LinkedList();
    test(arg);
    
    然后编译器不再知道
    链接列表
    类型,而只知道
    列表
    ,无法再看到运行时实例也是
    队列
    ,并选择
    列表
    方法

    但实际上,它也在铸造


    当然,您可以(也可能应该)通过为具有重叠参数类型的方法指定不同的名称来避免整个混乱。

    对于方法重载,由编译器决定使用哪个方法。对于JVM,您的两个方法是完全不同的,就像它们有完全不同的名称一样。使用方法重写,这是不同的,然后由“点之前的对象”的运行时类决定,这就是JVM的工作

    因此,您必须与编译器打交道,帮助他选择正确的方法。编译器的静态类型分析必须明确排除这两种情况之一

    在代码中,编译器看到
    test(newlinkedlist())并推断LinkedList的静态类型。知道该类同时实现了
    列表
    队列
    ,他不能选择一种方法

    您不想像在
    test((List)newlinkedlist()中那样强制转换。那么您可能愿意接受的唯一变体就是引入一个明确类型的局部变量,例如

    List arg = new LinkedList();
    test(arg);
    
    然后编译器不再知道
    链接列表
    类型,而只知道
    列表
    ,无法再看到运行时实例也是
    队列
    ,并选择
    列表
    方法

    但实际上,它也在铸造


    当然,您可以(也可能应该)通过为具有重叠参数类型的方法指定不同的名称来避免整个混乱。

    您想使用哪一个?哪种方法?因为如果你知道为什么要写两种方法因为如果你想消除歧义,你可能知道需要使用哪种方法:使用不同的方法名……这与IntelliJ IDE无关。你想使用哪种方法?哪种方法?因为如果你知道为什么要写两种方法因为如果您想消除歧义,您可能知道需要使用哪个方法:使用不同的方法名……这与IntelliJ IDE无关。