“合作”是一个模糊的问题,因此您可能会得到模糊的答案。
类型推断不是读心术;这只是约束解决。可用的类型约束越少,您就越有可能遇到失败或令人惊讶的结果(推断出您没有预料到的类型,例如Object
.)
钻石说:我需要的类型可能已经存在于左侧,为什么要在右侧重复它们。
局部变量类型推断说:我需要的类型可能已经存在于右侧,为什么要在左侧重复它们。
通用方法调用说:我需要的类型可能已经存在于参数中,为什么要重复它们作为见证。
如果程序中有足够的类型信息可用,而左侧没有清单构造函数类型参数或目标类型,那么一切都会好起来的。例如:
List<String> anotherList = ...
var list = new ArrayList<>(anotherList);
在这里,编译器能够ArrayList
通过查看构造函数(接受 的那个Collection<? extends E>
)的参数类型来推断 的类型参数。所以它推断T=String
RHS,然后能够推断ArrayList<String>
LHS。
换句话说,编译器将根据您提供的信息做它可以做的事情。你给它的信息越少,它就越有可能失败,或者不做你想做的事。
也就是说,我认为你问错了问题。你可以遗漏多少的问题不应该由“编译器让我遗漏多少”来驱动,而是“我对程序的可读性造成了多大的损害”。阅读代码比编写代码更重要。遗漏所有可能遗漏的内容不太可能最大限度地提高可读性。您应该努力留出足够的内容,以确保没有读者在面对您的程序时感到困惑。