我已经在JavaFX pursuant to this answer中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分使用不同的字体样式。

我将此自定义表格单元格用于两种不同类型的TableView:TableView<Track>TableView<Album>

TrackAlbum都实现接口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 invariantTableCell<AlbumInfoSource, String>不是TableCell<Album, String>,反之亦然。

如果需要能够在方法中创建TableColumn<Album, String>,则需要TableCell<Album...,而不是TableCell<AlbumInfoSource...。但是您也希望它对AlbumInfoSource的其他实现有效,因此更改单元格将不起作用。

这意味着您需要通过泛型引入另一个间接级别。

class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>


这表示我们可以创建FormattedAlbumCell的不同通用版本,但要遵守TAlbumInfoSource的更特定类型(即扩展或实现)的约束。

现在我们可以创建一个FormattedAlbumCell<Track>,它将是一个TableCell<Track, String>,或者我们可以创建一个FormattedAlbumCell<Album>,它将是一个TableCell<Album, String>

另见Oracle's generics tutorial

关于java - 如何解决此警告? -是原始类型。泛型类型的引用应参数化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53258730/

10-09 05:04