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不让我管理这个项目
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无关。