Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 类型推断是否会与构建器一起工作?_Java_Type Inference - Fatal编程技术网

Java 类型推断是否会与构建器一起工作?

Java 类型推断是否会与构建器一起工作?,java,type-inference,Java,Type Inference,,并且已经表明类型推断存在一些限制。我想再举一个简单的例子,询问是否有使编译器更智能的已知计划,或者新的java版本是否已经可以做到这一点(我仍然使用java 8) 这是我的例子。如果您尝试为某种类型的表定义“列”(E是“行数据”的类型),则会自然而然地出现此问题: 类列{ 最终字符串标题; 最终功能值; 最终整数相对宽度; 私有列(字符串标题、函数值、整数相对宽度){ this.header=头; 这个值=值; this.relativeWidth=relativeWidth; } 静态生成器

,并且已经表明类型推断存在一些限制。我想再举一个简单的例子,询问是否有使编译器更智能的已知计划,或者新的java版本是否已经可以做到这一点(我仍然使用java 8)

这是我的例子。如果您尝试为某种类型的表定义“列”(
E
是“行数据”的类型),则会自然而然地出现此问题:

类列{
最终字符串标题;
最终功能值;
最终整数相对宽度;
私有列(字符串标题、函数值、整数相对宽度){
this.header=头;
这个值=值;
this.relativeWidth=relativeWidth;
}
静态生成器创建(字符串头、函数值){
返回新生成器(标题、值);
}
静态类生成器{
私有最终字符串头;
私人最终功能价值;
私有int相对宽度=1;
生成器(字符串标题、函数值){
this.header=头;
这个值=值;
}
生成器宽度(整数相对宽度){
this.relativeWidth=relativeWidth;
归还这个;
}
列构建(){
返回新列(标题、值、相对宽度);
}
}
}
显式设置类型参数是使编译器理解的一种方法:

Column yearColumn=Column.create(“年”,
d->Integer.toString(d.getYear())
.build();
但这不是用Java 8编译的:

Column yearColumn=Column.create(“年”,
d->Integer.toString(d.getYear())
.build();
下面是我的问题:

  • 这个限制的确切名称是什么
  • 有没有一个很好的理由说明这不应该起作用
  • 编译器能否在以后的Java版本中推断出该类型,或者目前是否有任何计划使其“更智能”

我在这方面做过尝试

函数是限制,它必须返回一个字符串。我用
私有最终函数值更改了它的类型
现在我可以打电话了

Column<LocalDate> yearColumn = Column.create("Year",LocalDate::getYear)
    .build();
Column yearColumn=Column.create(“年”,LocalDate::getYear)
.build();
我不知道您在哪里使用Function.apply方法,即使可以或不可以这样做,但我们可以使用value.apply(…)更新所有value.apply(…)和value.apply(…).toString(),如果需要的话

这里有一些例子

interface Car {
    enum Shift {AUTO, MANUAL}
    Integer getYear();
    String getModel();
    Long getMileage();

    Shift getShift();

}

public static void main(final String[] args) {


    Column<LocalDate> yearColumn = Column.create("Year",
            LocalDate::getYear)
            .build();

    Column<Car> nameColumn = Column.create("Model",
            Car::getYear)
            .build();

    Column<Car> mileageColumn = Column.create("Mileage",
            Car::getMileage)
            .build();

    Column<Car> shiftColumn = Column.create("Shift",
            Car::getShift)
            .build();

}
接口车{
枚举移位{自动,手动}
整型getYear();
字符串getModel();
长里程();
Shift-getShift();
}
公共静态void main(最终字符串[]args){
Column yearColumn=Column.create(“年”,
LocalDate::getYear)
.build();
Column name Column=Column.create(“模型”,
汽车:getYear)
.build();
Column mileageColumn=Column.create(“里程”,
汽车里程)
.build();
Column shiftColumn=Column.create(“Shift”,
汽车:getShift)
.build();
}

这是行不通的。编译器无法猜测它所基于的类型,因为它有一个
getYear
方法。可能有多个类型有这样的方法。@marstran它可以检查返回值分配给的变量的类型,但我似乎还记得讨论过,它不值得这么做,因为它会涉及许多无论如何都不起作用的情况。您也可以使用
列。创建
,而不是在lambda中指定类型(
(LocalDate d)->
)like@marstran编译器已经可以在一个非常类似的场景中完成这项工作。尝试更改示例,使
create
方法直接返回
Column
,而不是
Builder
。那么就不需要额外的提示了。@Michael谢谢,我已经更新了示例