为什么不允许使用'var'的复合定义?

时间:2018-03-07 14:35:34

标签: java java-10

好吧,我真的认为这会起作用(在方法内):

var x, y = 1;

var x = 1, y = 2;

但它没有,它不会编译 - “化合物定义中不允许使用var”。

我想这是通常的权衡取舍。这不是一个非常常用的功能,因此没有实现,但我们可以肯定,可能会在将来的版本中...

1 个答案:

答案 0 :(得分:12)

好吧,如果你给它一个清单类型:

int x, y = 1;

这声明了两个int变量,并初始化其中一个变量。但是局部变量类型推断需要初始化器来推断类型。所以你已经死了。

但是,假设您打算为两者提供初始化程序。当两个初始化程序具有相同类型时,“显而易见”该做什么。所以让我们变得更难。假设你说:

var x = 1, y = 2.0;

这是什么意思?这会将x声明为int而将y声明为float吗?或者它是否尝试找到某种类型,可以是x和y的类型?无论我们决定哪一方,有些人会认为它应该以另一种方式运作,而且从根本上来说会让人感到困惑。

并且,有什么好处?与潜在的语义混淆相比,说出你的意思的增量语法成本是微不足道的。这就是为什么我们将这种情况排除在本地人的类型推断范围之外。

然后,你可能会说,“好吧,只有当它们属于同一类型时才能使它工作。”我们可以做到这一点,但是现在你可以使用推理的时间界限,以及何时可以使用更复杂的。而且我现在正在回答同样的“为什么不是你”的问题......现实情况是,推理方案总是有限制的;你要选择的是边界。最好选择干净,清晰的限制(“可以在这些环境中使用它”)而不是模糊限制。