我已经在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();
}
我的Custom 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>
,则警告消失。但是然后我不能对TableView<Track>
使用FormattedAlbumCell,我将不得不复制FormattedAlbumCell类以使其扩展TableCell,这对我来说似乎很愚蠢。有没有一种方法可以直接获得这些参数而无需创建两个单独的类?看来问题出在与接口有关的参数化方面。
最佳答案
您的FormattedAlbumCell
具有两个通用类型参数(<T, S>
),从外观上看,它们是完全未使用的。删除它们。
class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
变成
class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
您的下一个问题是generics are invariant。
TableCell<AlbumInfoSource, String>
不是TableCell<Album, String>
,反之亦然。如果需要能够在方法中创建
TableColumn<Album, String>
,则需要TableCell<Album...
,而不是TableCell<AlbumInfoSource...
。但是您也希望它对AlbumInfoSource
的其他实现有效,因此更改单元格将不起作用。这意味着您需要通过泛型引入另一个间接级别。
class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>
这表示我们可以创建
FormattedAlbumCell
的不同通用版本,但要遵守T
是AlbumInfoSource
的更特定类型(即扩展或实现)的约束。现在我们可以创建一个
FormattedAlbumCell<Track>
,它将是一个TableCell<Track, String>
,或者我们可以创建一个FormattedAlbumCell<Album>
,它将是一个TableCell<Album, String>
。另见Oracle's generics tutorial
关于java - 如何解决此警告? -是原始类型。泛型类型的引用应参数化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53258730/