gpt4 book ai didi

java - 类型推断是否适用于构建器?

转载 作者:行者123 更新时间:2023-12-01 12:11:19 25 4
gpt4 key购买 nike

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

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

class Column<E> {

final String header;
final Function<E, String> value;
final int relativeWidth;

private Column(String header, Function<E, String> value, int relativeWidth) {
this.header = header;
this.value = value;
this.relativeWidth = relativeWidth;
}

static <E> Builder<E> create(String header, Function<E, String> value) {
return new Builder<>(header, value);
}

static class Builder<E> {

private final String header;
private final Function<E, String> value;
private int relativeWidth = 1;

Builder(String header, Function<E, String> value) {
this.header = header;
this.value = value;
}

Builder<E> width(int relativeWidth) {
this.relativeWidth = relativeWidth;
return this;
}

Column<E> build() {
return new Column<>(header, value, relativeWidth);
}
}
}


显式设置类型参数是让编译器理解的一种方式:

Column<LocalDate> yearColumn = Column.<LocalDate>create("Year",
d -> Integer.toString(d.getYear()))
.build();

但这不能用 Java 8 编译:

Column<LocalDate> yearColumn = Column.create("Year",
d -> Integer.toString(d.getYear()))
.build();

所以这里是我的问题,再次:
  • 这个限制的确切名称是什么?
  • 有没有充分的理由说明这不应该起作用?
  • 编译器能否在以后的 Java 版本中推断出类型,或者目前是否有任何计划使其“更智能”?
  • 最佳答案

    我已经在这方面尝试过一些东西;

    函数是极限,它必须返回一个字符串。我用 private final Function<E, Object> value; 改变了它的类型
    现在我可以打电话

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

    我不知道您在哪里使用 Function.apply 方法,即使可以或不可以这样做,但我们可以使用 value.apply(...).toString() 更新所有 value.apply(...)如果有必要。

    这是一些例子;
    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();

    }

    关于java - 类型推断是否适用于构建器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57804995/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com