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



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

我在两种不同类型的表视图上使用此自定义表单元格: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();
}

My 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<T,S>应参数化

如果我更改FormattedAlbumCell类,使其扩展TableCell <Album, String>,则警告将消失。但是,我不能将FormattedAlbumCell用于TableView<Track>,我必须复制FormattedAlbum Cell类,使其扩展TableCell,这对我来说似乎很愚蠢。

有没有一种方法可以在不创建两个单独的类的情况下直接获得这些参数?这个问题似乎来自于参数化的东西在接口方面遇到的问题。

您的FormattedAlbumCell有两个泛型类型参数(<T, S>(,从外观上看,它们是完全未使用的。拆下它们。

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

成为

class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>

您的下一个问题是泛型是不变的。TableCell<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的泛型教程

最新更新