Java 如何处理此警告?-这是一种原始类型。对泛型类型的引用应参数化

Java 如何处理此警告?-这是一种原始类型。对泛型类型的引用应参数化,java,Java,我已经在JavaFX中创建了一个自定义表格单元格,因此我可以对单元格文本的不同部分使用不同的字体样式 我在两种不同类型的TableView上使用此自定义表格单元格:TableView和TableView 曲目和相册都实现了接口AlbumInfoSource: 我的自定义TableCell是使用该AlbumInfoSource键入的,因此它可以为TableView和TableView呈现单元格 以下是基本代码: public class FormattedAlbumCell<T, S>

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

我在两种不同类型的TableView上使用此自定义表格单元格:TableView和TableView

曲目和相册都实现了接口AlbumInfoSource:

我的自定义TableCell是使用该AlbumInfoSource键入的,因此它可以为TableView和TableView呈现单元格

以下是基本代码:

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,则警告消失。但是我不能将FormattedAlbumCell用于TableView,我必须复制FormattedAlbumCell类,使其扩展TableCell,这在我看来是愚蠢的

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

您的FormattedAlbumCell有两个泛型类型参数,从外观上看,它们完全没有使用。移除它们

class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
也就是说,我们可以创建FormattedAlbumCell的不同通用版本,但要受T是更具体的AlbumInfoSource类型的约束,即扩展或实现它

现在我们可以创建一个FormattedAlbumCell,它将是一个TableCell,或者我们可以创建一个FormattedAlbumCell

您的FormattedAlbumCell有两个通用类型参数,从外观上看,这两个参数完全没有使用。移除它们

class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
也就是说,我们可以创建FormattedAlbumCell的不同通用版本,但要受T是更具体的AlbumInfoSource类型的约束,即扩展或实现它


现在我们可以创建一个FormattedAlbumCell,它将是一个TableCell,或者我们可以创建一个FormattedAlbumCell

为什么有?没有它,我在那一行得到了一个错误而不是警告,它设置了单元格工厂类型不匹配:无法从FormattedAlbumCell转换到TableCell。有人在一条现已删除的注释中建议我将其改为e->new FormattedAlbumCell。这会导致错误,FormattedAlbumCell类型不是泛型;它不能用参数参数化。@JoshuaD但FormattedAlbumCell显然是泛型的,如果它具有您所显示的声明。你指的是正确的课程吗?我编辑了原始帖子,让它更清楚。为什么你有这个?没有它,我在那一行得到了一个错误而不是警告,它设置了单元格工厂类型不匹配:无法从FormattedAlbumCell转换到TableCell。有人在一条现已删除的注释中建议我将其改为e->new FormattedAlbumCell。这会导致错误,FormattedAlbumCell类型不是泛型;它不能用参数参数化。@JoshuaD但FormattedAlbumCell显然是泛型的,如果它具有您所显示的声明。您指的是正确的类吗?我编辑了原始帖子以使其更清楚。这会导致当前发出警告的行上出现错误-类型不匹配:无法从FormattedAlbumCell转换为TableCellAlbumInfoSource。FormattedAlbumCell由一些不同的TableView使用,所有这些TableView都显示实现AlbumInfoSource的类。困难似乎在于用参数来分类。你关于复制/粘贴的评论没有帮助。是的,这似乎是导致警告的原因。非常感谢。考虑到代码可以正常工作,并且创建一个重复的类似乎是不可取的,请参见澄清对原始帖子的编辑,我应该怎么做?只需抑制警告并继续?重构并接受重复的代码?还有什么?我不能更改albumColumn,然后我还必须更改albumTable,在其他地方,它需要完整的相册,而不仅仅是狭窄的AlbumInfoSource。如果我将FormattedAlbumCell更改为TableCellSweet!成功了。我还必须更改setCellFactory如下:e->new FormattedAlbumCell。您是否可以编辑此解决方案的答案?如果您愿意,为什么这样做?那我就可以接受了。非常感谢。这会在当前发出警告的行上导致错误-类型不匹配:无法从FormattedAlbumCell转换为TableCellAlbumInfoSource。FormattedAlbumCell由一些不同的TableView使用,所有这些TableView都显示实现AlbumInfoSource的类。困难似乎在于用参数来分类。你关于复制/粘贴的评论没有帮助。是的,这似乎是导致警告的原因。非常感谢。考虑到代码是有效的,并且创建一个重复的类似乎是不可取的,请参见澄清对原始帖子的编辑,我应该怎么做
? 只需抑制警告并继续?重构并接受重复的代码?还有什么?我不能更改albumColumn,然后我还必须更改albumTable,在其他地方,它需要完整的相册,而不仅仅是狭窄的AlbumInfoSource。如果我将FormattedAlbumCell更改为TableCellSweet!成功了。我还必须更改setCellFactory如下:e->new FormattedAlbumCell。您是否可以编辑此解决方案的答案?如果您愿意,为什么这样做?那我就可以接受了。非常感谢。
class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>