当前位置: 首页 > 面试题库 >

“数组初始值设定项需要明确的目标类型”-为什么?

邵君植
2023-03-14
问题内容

遵循JEP 286:局部变量类型推断描述

我想知道引入这种限制的原因是什么,例如:

Main.java:199: error: cannot infer type for local variable k

    var k = { 1 , 2 };
        ^  
(array initializer needs an explicit target-type)

因此,对我而言,逻辑上应该是:

var k = {1, 2}; // Infers int[]
var l = {1, 2L, 3}; // Infers long[]

因为Java编译器已经 可以 正确推断数组的类型:

void decide() {
    arr(1, 2, 3);  // call  void arr(int ...arr)
    arr(1, 2L, 3); // call  void arr(long ...arr)
}

void arr(int ...arr) {
}

void arr(long ...arr) {
}

那么有什么障碍呢?


问题答案:

每当我们提高Java中类型推论的范围时,我们都会得到“但是您也可以推论这一点,为什么不呢?”。(或者有时候,礼貌些。)

有关设计类型推断方案的一些一般性意见:

  • 推理方案将始终具有局限性。总是有些情况下,我们无法推断出答案,或者最终推断出令人惊讶的事情。我们越难推断所有事情,就越有可能推断出令人惊讶的事情。这并不总是最好的权衡。
  • 选择“但是肯定可以在这种情况下推断”的例子很容易。但是,如果这种情况与没有明显答案的其他情况非常相似,我们就解决了这个问题-“为什么X和Y都是Z,它为什么适用于X但不适用于Y?”
  • 总是可以采用推理方案来处理增量情况,但是几乎总是存在附带损害,其形式是在其他情况下获得更差的结果,不稳定的增加(在这种情况下似乎无关的更改可能会改变推断的类型),或者更加复杂。您不想仅针对可以推断的案例数进行优化;您还希望针对受过教育的用户进行预测,以预测哪些将起作用,哪些将不起作用。在这里画一条简单的线(例如,不要费力去推断数组初始化器的类型)通常是一个胜利。
  • 考虑到总是存在限制,选择一个较小但定义更好的目标通常会更好,因为这可以简化用户模型。(请参阅有关“为什么不能对私有方法的返回类型使用类型推断的相关问题。答案是我们可以做到这一点,但是结果将是更复杂的用户模型,以实现较小的表达利益。我们称之为“”复杂性回报率不高。”)


 类似资料:
  • 我对Swift类有一个问题。我有UITableViewController类和UITableViewCell类的swift文件。我的问题是UITableViewCell类和网点。这个类有一个错误Class“HomeCell”没有初始化程序,我不明白这个问题。 感谢您的回复。

  • 问题内容: 是否有任何特定原因为何未将对指定的初始化程序的支持添加到g ?是C99标准来晚了,而g 却被开发得更早,后来人们却不在乎这个问题的原因,还是在C ++语法中实现指定的初始化程序存在一些固有的困难? 问题答案: 正如我在评论中指出的那样,G ++不支持C99标准指定的初始化程序,但是它支持对C90的GNU扩展,它允许指定的初始化程序。所以这不起作用: 但这确实是: 这似乎是C和C 标准委

  • 在我的Angular应用程序中,我有一个组件: 但在“make”属性中我有一个错误。我不知道该怎么处理...

  • 我通过解决一些黑客等级问题来学习java。下面的代码是关于学习静态初始值设定项块的。例外情况是thown和Capture,但程序仍在运行,我不确定原因。 输入:-1,2 预期输出:java.lang.例外:宽度和高度必须为正 实际输出:宽度和高度必须为正-2

  • 我甚至知道这在C++11标准中有什么规定:14.8.2.5/5子弹5: [如果程序有]一个函数参数,该函数参数的关联参数是初始值设定项列表(8.5.4),但该参数没有std::initializer_list或可能引用CV限定的std::initializer_list类型。[示例: 模板空隙g(T);