gpt4 book ai didi

java - 如何解决这个警告? - 是原始类型。对泛型类型的引用应该被参数化

转载 作者:行者123 更新时间:2023-11-29 06:26:59 25 4
gpt4 key购买 nike

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

我在两种不同类型的 TableView 上使用此自定义表格单元格:TableView<Track>TableView<Album> .

两者都是 TrackAlbum实现接口(interface) 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 () );

这完全没问题,但我在最后一行收到一条警告,上面写着:

Warning: FormattedAlbumCell is a raw type. References to generic type FormattedAlbumCell< T ,S > should be parameterized

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

有没有办法在不创建两个单独的类的情况下直接获取这些参数?问题似乎来自参数化的东西在接口(interface)方面有问题。

最佳答案

你的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com