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

Jos*_*uaD 1 java

我已经根据这个答案在JavaFX中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分设置不同的字体样式.

我在两种不同类型的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();

}
Run Code Online (Sandbox Code Playgroud)

我的自定义TableCell使用该AlbumInfoSource键入,因此它可以为a TableView<Album>和a 渲染单元格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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将它应用于这样的列:

TableColumn<Album, String> albumColumn;
albumColumn = new TableColumn<Album, String>( "Album" );
albumColumn.setCellFactory( e -> new FormattedAlbumCell () );
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好,但我在最后一行收到警告,其中说:

警告:FormattedAlbumCell是原始类型.应参数化对泛型类型FormattedAlbumCell <T,S>的引用

如果我更改我的FormattedAlbumCell类使其扩展TableCell <Album, String>,那么警告就会消失.但是后来我不能使用FormattedAlbumCell了TableView<Track>,我不得不复制FormattedAlbumCell类使它扩展TableCell,这对我来说似乎是愚蠢的.

有没有办法直接获得这些参数而不创建两个单独的类?看起来这个问题来自于接口故障的参数化问题.

Mic*_*ael 7

FormattedAlbumCell有两个泛型类型参数(<T, S>),根据事物的外观,它们是完全未使用的.删除它们.

class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
Run Code Online (Sandbox Code Playgroud)

class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
Run Code Online (Sandbox Code Playgroud)

你的下一个问题是泛型是不变的.A TableCell<AlbumInfoSource, String>不是TableCell<Album, String>,反之亦然.

如果你需要能够TableColumn<Album, String>在你的方法中创建一个,那么你需要一个TableCell<Album...,而不是一个TableCell<AlbumInfoSource....但是您也希望这适用于其他实现AlbumInfoSource,因此更改单元格将无法正常工作.

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

class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>
Run Code Online (Sandbox Code Playgroud)

这表示我们可以创建不同的泛型版本FormattedAlbumCell,受限于T更具体类型的约束AlbumInfoSource(即扩展或实现它).

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

另请参阅Oracle的泛型教程