Java IntelliJ-为什么这是未经检查的作业?

Java IntelliJ-为什么这是未经检查的作业?,java,intellij-idea,Java,Intellij Idea,我正在运行IntelliJ IDEA Ultimate 2017.2,并且在以下代码块上有一个检查警告未选中的分配:“匿名javafx.scene.control.TableCell”到“javafx.scene.control.TableCell”: colTopRepsRank.setCellFactory(new Callback<TableColumn<RepStats, Integer>, TableCell<RepStats, Integer>>(

我正在运行IntelliJ IDEA Ultimate 2017.2,并且在以下代码块上有一个检查警告
未选中的分配:“匿名javafx.scene.control.TableCell”到“javafx.scene.control.TableCell”

colTopRepsRank.setCellFactory(new Callback<TableColumn<RepStats, Integer>, TableCell<RepStats, Integer>>() {
        @Override
        public TableCell<RepStats, Integer> call(TableColumn<RepStats, Integer> param) {
            return new TableCell() {
                @Override
                protected void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    setGraphic(null);
                    setText(empty ? null : getIndex() + 4 + "");
                }
            };
        }
    }
);
colTopRepsRank.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn参数){
返回新的TableCell(){
@凌驾
受保护的void updateItem(对象项,布尔值为空){
super.updateItem(项,空);
设置图形(空);
setText(空?null:getIndex()+4+“”);
}
};
}
}
);

我正试图弄明白为什么会发生这种情况。如果我按照IntelliJ的建议,让
call()
方法只返回
javafx.scene.control.TableCell
,我会收到其他错误,因为
TableColumn
需要
TableCell

之所以出现错误,是因为
TableCell
(不带类型参数)的类型信息少于
TableCell
(前者可能是另一个表视图/项目组合的
TableCell

为了修复它,在
call()
实现中返回正确键入的
TableCell
就足够了,比如:

return new TableCell<RepStats, Integer>() {
  @Override
  protected void updateItem(Integer item, boolean empty) {
  // ...
  }
}
返回新的TableCell(){
@凌驾
受保护的void updateItem(整数项,布尔值为空){
// ...
}
}

出现错误是因为
TableCell
(无类型参数)的类型信息少于
TableCell
(前者可能是另一个表视图/项目组合的
TableCell

为了修复它,在
call()
实现中返回正确键入的
TableCell
就足够了,比如:

return new TableCell<RepStats, Integer>() {
  @Override
  protected void updateItem(Integer item, boolean empty) {
  // ...
  }
}
返回新的TableCell(){
@凌驾
受保护的void updateItem(整数项,布尔值为空){
// ...
}
}

这是因为该方法希望返回类型为
TableCell
,而您返回的是未定义类型的TableCell。这意味着您应该添加泛型和方法所需的类型。 试试这个:

...
return new TableCell<RepStats, Integer>() {...}
。。。
返回新的TableCell(){…}

这是因为该方法希望返回类型为
TableCell
,而您返回的是未定义类型的TableCell。这意味着您应该添加泛型和方法所需的类型。 试试这个:

...
return new TableCell<RepStats, Integer>() {...}
。。。
返回新的TableCell(){…}

您不需要返回新的TableCell而不是原始TableCell吗?您不需要返回新的TableCell而不是原始TableCell吗?或者现在使用Java 9,
返回新的TableCell(){
(我自己还没有测试过,但是diamond操作符应该在Java 9中对可表示的类型起作用)@MarkPeters在Java 8中工作。MartinStettner,谢谢你;这对我来说是可行的!@Zephyr:你确定吗?我收到一个错误“不能将“”用于匿名内部类”.diamond运算符是在Java 7中引入的。是的,但据我所知,在匿名内部类上使用它的能力是从Java 9开始的。请参见此处:或者现在使用Java 9,
返回新的TableCell(){
(我自己还没有测试过,但diamond运算符应该在Java 9中处理可表示类型)@MarkPeters在Java 8中工作。MartinStettner,谢谢你;这对我来说是可行的!@Zephyr:你确定吗?我收到一个错误“不能将“”用于匿名内部类”。Java 7中引入了菱形运算符。是的,但据我所知,在匿名内部类上使用菱形运算符的能力是从Java 9开始的。请参阅此处: