You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在匿名内部类中使用Java泛型:TableCell实例化类型参数疑问

解决TableCell实例化时的通配符问题

首先,你遇到的核心问题是通配符?不能用来实例化对象——它代表的是一个未知类型,Java编译器无法确定具体要创建哪种类型的TableCell实例,自然会报错。

解决这个问题的最优方案是把你的方法改成泛型方法,用一个具体的类型参数替代通配符,这样就能在实例化TableCell时明确指定类型了。

修改后的代码示例

<T> void setTableCellStuff(TableColumn<Object, T> tableCell) {
    tableCell.setCellFactory(arg0 -> new TableCell<Object, T>() {
        // 这里可以自定义TableCell的逻辑,比如重写updateItem方法
        @Override
        protected void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            if (empty || item == null) {
                setText(null);
            } else {
                setText(item.toString());
            }
        }
    });
}

为什么这样可行?

  • 我们引入了泛型类型参数<T>,它会在方法被调用时由编译器自动推断出具体类型,对应TableColumn和TableCell的第二个类型参数。
  • 实例化TableCell<Object, T>时,类型不再是未知的通配符,编译器能确定要创建的对象类型,也就不会报错了。

兼容通配符参数的进阶写法

如果你需要保留原方法参数的通配符(比如要兼容多种类型的TableColumn),可以通过捕获通配符的方式,用一个内部泛型辅助方法来处理:

void setTableCellStuff(TableColumn<Object, ?> tableCell) {
    // 调用辅助方法捕获通配符对应的具体类型
    setTableCellStuffHelper(tableCell);
}

private <T> void setTableCellStuffHelper(TableColumn<Object, T> tableCell) {
    tableCell.setCellFactory(arg0 -> new TableCell<Object, T>() {
        @Override
        protected void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            setText(empty || item == null ? null : item.toString());
        }
    });
}

这种写法既保持了原方法参数的灵活性,又完美解决了实例化TableCell时的类型问题。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:15:16