And*_*niy 25 java arrays local-variables java-10
遵循JEP 286:局部变量类型推断描述
我想知道,引入这种限制的原因是什么,如:
Run Code Online (Sandbox Code Playgroud)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[]
Run Code Online (Sandbox Code Playgroud)
因为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) {
}
Run Code Online (Sandbox Code Playgroud)
那么障碍是什么?
Bri*_*etz 30
每次我们改进Java中类型推断的范围时,我们都会得到一连串"但你也可以推断出这一点,为什么不呢?" (或者有时候,不太礼貌.)
关于设计类型推理方案的一些一般性观察:
Mar*_*eel 21
来自邮件列表平台-jep-discuss,由Brian Goetz 于星期四(2016年3月10日星期四15:07:54)发送消息Reader Mail Bag:
当初始化程序是数组初始值设定项时,为什么不能使用var,如:
Run Code Online (Sandbox Code Playgroud)var ints = { 1, 2, 3 }规则是:我们通过将初始化程序视为独立表达式并派生其类型来派生变量的类型.但是,数组初始值设定项(如lambdas和方法引用)是多重表达式 - 它们需要目标类型才能计算其类型.所以他们被拒绝了.
我们可以做这个工作吗?我们可能会.但它会为这个功能增加很多复杂性,这是为了一个大多数情况下的好处.我们希望这是一个简单的功能.
短手数组初始值设定项从声明中获取其类型信息,但是这里的声明var必须明确指定.
您需要选择:
var k = new int[]{ 1 , 2 };
Run Code Online (Sandbox Code Playgroud)
要么
int[] k = { 1 , 2 };
Run Code Online (Sandbox Code Playgroud)
允许var k = { 1 , 2 }会改变已经是语法糖的东西的语义.在int[] n = { 1, 2 }类型的情况下由声明确定.如果您允许var n = { 1, 2 }该类型突然由初始化程序本身确定.这可能会导致(更容易创建)编译器错误或模糊.
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |