【发布时间】:2018-11-12 08:58:20
【问题描述】:
我在 JavaFX 中创建了一个自定义表格单元格pursuant to this answer,因此我可以为单元格文本的不同部分设置不同的字体样式。
我在两种不同类型的 TableView 上使用这个自定义表格单元:TableView<Track> 和 TableView<Album>。
Track 和 Album 都实现了接口 AlbumInfoSource:
public interface AlbumInfoSource {
public String getAlbumTitle();
public String getFullAlbumTitle();
public String getReleaseType();
public String getDiscSubtitle();
public Integer getDiscCount();
public Integer getDiscNumber();
}
我的自定义 TableCell 是使用该 AlbumInfoSource 键入的,因此它可以为 TableView<Album> 和 TableView<Track> 呈现单元格。
这是基本代码:
public class FormattedAlbumCell<T, S> extends TableCell <AlbumInfoSource, String> {
private TextFlow flow;
private Label albumName, albumType, albumDisc;
public FormattedAlbumCell () {
/* Do constructor stuff */
}
@Override
protected void updateItem ( String text, boolean empty ) {
super.updateItem ( text, empty );
/* Do pretty rendering stuff */
}
}
然后我将它应用到这样的列:
TableColumn<Album, String> albumColumn;
albumColumn = new TableColumn<Album, String>( "Album" );
albumColumn.setCellFactory( e -> new FormattedAlbumCell () );
效果很好,但我在最后一行收到警告,上面写着:
警告:FormattedAlbumCell 是原始类型。对泛型类型 FormattedAlbumCell 的引用应该被参数化
如果我更改我的 FormattedAlbumCell 类,使其扩展 TableCell <Album, String>,那么警告就会消失。但是我不能将 FormattedAlbumCell 用于TableView<Track>,我将不得不复制 FormattedAlbumCell 类使其扩展 TableCell,这对我来说似乎很愚蠢。
有没有办法在不创建两个单独的类的情况下直接获取这些参数?问题似乎来自于接口有问题的参数化东西。
【问题讨论】:
-
你为什么有
<T, S>? -
没有它,我会在设置单元工厂的那一行上收到错误而不是警告——“类型不匹配:无法从 FormattedAlbumCell 转换为 TableCell
”。 -
有人在现已删除的评论中建议我将其设为“e -> new FormattedAlbumCell ()”。这会产生错误“FormattedAlbumCell 类型不是通用的;它不能用参数 进行参数化”。
-
@JoshuaD 但
FormattedAlbumCell显然 是 通用的,如果它具有您显示的声明。你指的是正确的类吗? -
我已经编辑了原始帖子以使其更加清晰。
标签: java