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 7中,diamond运算符不能在addAll()调用中工作吗?_Java_Generics_Java 7_Diamond Operator - Fatal编程技术网

为什么';在Java 7中,diamond运算符不能在addAll()调用中工作吗?

为什么';在Java 7中,diamond运算符不能在addAll()调用中工作吗?,java,generics,java-7,diamond-operator,Java,Generics,Java 7,Diamond Operator,给这个例子 List List=new ArrayList(); 列表。添加(“A”); //以下语句应失败,因为addAll需要 //收集文档中的解释似乎直接回答了这个问题(除非我遗漏了其他内容) JavaSE7及更高版本支持有限类型推断以创建泛型实例;只有当构造函数的参数化类型在上下文中很明显时,才能使用类型推断。例如,以下示例不编译: List<String> list = new ArrayList<>(); list.add("A"); // The fo

给这个例子

List List=new ArrayList();
列表。添加(“A”);
//以下语句应失败,因为addAll需要
//收集文档中的解释似乎直接回答了这个问题(除非我遗漏了其他内容)

JavaSE7及更高版本支持有限类型推断以创建泛型实例;只有当构造函数的参数化类型在上下文中很明显时,才能使用类型推断。例如,以下示例不编译:

List<String> list = new ArrayList<>();
list.add("A");

  // The following statement should fail since addAll expects
  // Collection<? extends String>

list.addAll(new ArrayList<>());
List List=new ArrayList();
列表。添加(“A”);
//以下语句应失败,因为addAll需要

//Collection首先:除非您使用的是Java7,否则所有这些都不会起作用,因为它只在Java版本中引入

同样,这个答案假设读者。如果您不知道,请阅读本教程的其他部分,了解这些内容后再回来

菱形实际上是一种捷径,当编译器能够自己找到类型时,它不必重复泛型类型信息

最常见的用例是在初始化变量的同一行中定义变量:

List<String> list = new ArrayList<>(); // is a shortcut for
List<String> list = new ArrayList<String>();
List List=new ArrayList();//这是一条捷径
列表=新的ArrayList();
在本例中,差异不是很大,但一旦你进入
Map
,它将是一个major增强(注意:我不鼓励实际使用这种结构!)

问题是这些规则只会走那么远。在上面的例子中,很明显应该使用什么类型,编译器和开发人员都同意

在这一行:

list.addAll(new ArrayList<>());
list.addAll(新的ArrayList());
这似乎是显而易见的。至少开发人员知道类型应该是
String


然而,在编译方法调用时,查看参数的定义,我们看到参数类型是
Collection,javac需要先知道参数的类型,然后再确定哪个方法签名与参数匹配。因此,在参数类型已知之前,方法参数类型是未知的


也许这是可以改进的;到今天为止,论点的类型与上下文无关。

“为什么下面的论点不起作用?”有点弱。你到底期望什么?错误信息是什么?“它不起作用”的原因有很多。你的问题应该更精确,才能得到准确的答案。当你阅读并吸收了这些内容后再来。事实上,从Java 7开始,这应该会起作用-
菱形操作符
,投票支持重新打开。Pradeep,你在使用Java 7吗?这是编译的先决条件。@PradeepKumar:如果您没有使用Java 7,那么这就是您的代码无法编译的原因:本教程针对Java 7。然而,您引用的特定代码甚至没有在Java7上编译(出于其他原因),本教程没有真正解释为什么菱形在这里不起作用。它只是挥挥手说它“经常有效”。@Kal。很抱歉打扰你。我听不懂。你能用简单的话解释一下吗。再一次抱歉。也许JLS说了些什么。嗯。。我觉得这很明显。它清楚地表明addAll期望Collection@Kal:可以很容易地说,在这种情况下,它可以简单地推断出类型
字符串
,该类型根据类型系统是正确的,并且将成功地允许调用。在我看来,这就足够了。这似乎是一个类似于Java 5和Java 6中旧的“为什么对象实例化不使用与方法调用相同的推理规则?”的限制(在Java 7中也是如此)。@joachim。感谢您的回答
List<String> list = new ArrayList<>(); // is a shortcut for
List<String> list = new ArrayList<String>();
list.addAll(new ArrayList<>());