使用类型化集合时编译错误含糊不清地引用方法

直流电

在同一个类中,我有两种重载方法:

public static <T> void foo(Collection<T> collection, T valueToAppend);
public static <T> void foo(Collection<T> collection, Collection<T> valueToAppend);

以下测试应调用第二种方法:

 @Test 
   public void testFoo() {
   ArrayList ftList = Lists.newArrayList();
   List<Double> doubleList = Lists.newArrayList(1.0, 2.0);
   foo(ftList, doubleList);
}

当我运行测试时,出现以下编译错误:

对foo的引用是不明确的,path.to.class中的方法foo(java.util.Collection,T)和path.to.class中的方法foo(java.util.Collection,T)都匹配。

我在第二个参数中传递了一个集合,那么为什么编译器不知道要使用第二种方法?
如果我更改方法签名并从第一个参数中删除泛型,我将不会得到编译错误,那是为什么?

保罗·波丁顿

这是我的解释。当编译器必须在重载之间进行选择时,它总是选择最具体的重载。当您从第一个参数中删除类型信息时,签名变为

public static <T> void foo(Collection collection, T valueToAppend)
public static <T> void foo(Collection collection, Collection<T> valueToAppend)

其中的第二个更为具体。第二种方法可以接受的任何一对参数也可以被第一种方法接受,因为anyCollection是一个Object因此,当您将类型参数剥离时,没有歧义-如果您传递两个Collections,则选择第二种方法

但是,使用类型信息,签名如下所示:

public static <T> void foo(Collection<T> collection, T valueToAppend)
public static <T> void foo(Collection<T> collection, Collection<T> valueToAppend)

这些签名中的任何一个都不比另一个更具体。参数new ArrayList<String>()"Foo"将被第一个签名接受,但第二个签名不接受。参数new ArrayList<String>()new ArrayList<String>()将被第二个签名接受,但第一个签名不接受。

因此,如果两个签名均适用,则存在问题。

您正在尝试传递原始字符ArrayList原始字符List<Double>由于您使用的是原始类型ArrayList(你应该永远不会做),ftList可以通过一个Collection<T>任何 T(尝试它。请尝试将原料List与类型的参数的方法List<String>。它的工作原理)。因此,您只需要看到两个重载doubleList与第二个参数匹配它的第一个签名,如果匹配的与第二签名匹配,如果TList<Double>TDouble

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

含糊不清地使用“ ??”

来自分类Dev

含糊不清地使用“密钥”

来自分类Dev

含糊不清地使用“密钥”

来自分类Dev

Java varargs 方法重载编译器错误 - 含糊不清?

来自分类Dev

Scala错误对重载定义的含糊不清的引用

来自分类Dev

对模板类的含糊不清的引用(C ++)

来自分类Dev

测试时含糊不清的方法

来自分类Dev

在Swift 2中含糊不清地使用“ init”和可选参数

来自分类Dev

Java:对..的引用含糊不清,方法中的method1和method2都匹配

来自分类Dev

XCGLogger:对成员“ log”的含糊不清的引用

来自分类Dev

尤里卡:对成员“ +++”的含糊不清的引用

来自分类Dev

Java重载:对调用的引用含糊不清

来自分类Dev

在字典上对成员“下标”的引用含糊不清

来自分类Dev

数组扩展,对成员“下标”的含糊不清的引用

来自分类Dev

对“列表”的引用含糊不清,包括头文件

来自分类Dev

Java库中对重载定义的含糊不清的引用

来自分类Dev

对成员'dataTask(with:completionHandler :)的含糊不清的引用

来自分类Dev

错误:使用复制和交换习惯的交换函数中的'operator ='含糊不清的重载

来自分类Dev

具体类型的“含糊不清的会员地图参考”

来自分类Dev

成员“下标”含糊不清

来自分类Dev

系列的真值含糊不清

来自分类Dev

春季简介含糊不清

来自分类Dev

Android Studio含糊不清的Object.toString方法调用

来自分类Dev

这是为什么Java方法调用认为含糊不清?

来自分类Dev

含糊不清地退出,并显示消息“服务器返回了引荐”

来自分类Dev

char *和char [N]含糊不清

来自分类Dev

C ++重载函数指针含糊不清

来自分类Dev

效率极低且含糊不清的代码

来自分类Dev

为什么这个电话含糊不清?

Related 相关文章

  1. 1

    含糊不清地使用“ ??”

  2. 2

    含糊不清地使用“密钥”

  3. 3

    含糊不清地使用“密钥”

  4. 4

    Java varargs 方法重载编译器错误 - 含糊不清?

  5. 5

    Scala错误对重载定义的含糊不清的引用

  6. 6

    对模板类的含糊不清的引用(C ++)

  7. 7

    测试时含糊不清的方法

  8. 8

    在Swift 2中含糊不清地使用“ init”和可选参数

  9. 9

    Java:对..的引用含糊不清,方法中的method1和method2都匹配

  10. 10

    XCGLogger:对成员“ log”的含糊不清的引用

  11. 11

    尤里卡:对成员“ +++”的含糊不清的引用

  12. 12

    Java重载:对调用的引用含糊不清

  13. 13

    在字典上对成员“下标”的引用含糊不清

  14. 14

    数组扩展,对成员“下标”的含糊不清的引用

  15. 15

    对“列表”的引用含糊不清,包括头文件

  16. 16

    Java库中对重载定义的含糊不清的引用

  17. 17

    对成员'dataTask(with:completionHandler :)的含糊不清的引用

  18. 18

    错误:使用复制和交换习惯的交换函数中的'operator ='含糊不清的重载

  19. 19

    具体类型的“含糊不清的会员地图参考”

  20. 20

    成员“下标”含糊不清

  21. 21

    系列的真值含糊不清

  22. 22

    春季简介含糊不清

  23. 23

    Android Studio含糊不清的Object.toString方法调用

  24. 24

    这是为什么Java方法调用认为含糊不清?

  25. 25

    含糊不清地退出,并显示消息“服务器返回了引荐”

  26. 26

    char *和char [N]含糊不清

  27. 27

    C ++重载函数指针含糊不清

  28. 28

    效率极低且含糊不清的代码

  29. 29

    为什么这个电话含糊不清?

热门标签

归档