如何解决此警告? -是原始类型。泛型类型的引用应参数化

时间:2018-11-12 08:58:21

标签: java

我已经在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();

}

我的自定义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,这对我来说似乎很愚蠢。

是否有一种方法可以直接获得这些参数而不创建两个单独的类?看来问题出在与接口有关的参数化方面。

1 个答案:

答案 0 :(得分:7)

您的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>的{​​{1}},或者我们可以创建一个TableCell<Track, String>的{​​{1}}。

另请参见Oracle's generics tutorial