代码之家  ›  专栏  ›  技术社区  ›  Grumblesaurus

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

  •  1
  • Grumblesaurus  · 技术社区  · 7 年前

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

    TableView<Track> TableView<Album> .

    二者都 Track Album 实现接口 AlbumInfoSource

    public interface AlbumInfoSource {
        public String getAlbumTitle();
        public String getFullAlbumTitle();
        public String getReleaseType();
        public String getDiscSubtitle();
        public Integer getDiscCount();
        public Integer getDiscNumber();
    
    }
    

    我的自定义TableCell是使用该AlbumInfoSource键入的,因此它可以为两个对象呈现单元格 .

    以下是基本代码:

    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> ,然后警告就消失了。但是我不能将格式化的Album单元格用于 ,我必须复制FormattedAlbumCell类,使其扩展TableCell,这对我来说似乎很愚蠢。

    1 回复  |  直到 7 年前
        1
  •  7
  •   Jon Gales    7 年前

    FormattedAlbumCell 有两个泛型类型参数( <T, S> )从外观上看,它们完全没有使用过。移除它们。

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

    class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
    

    你的下一个问题是 generics are invariant . A. TableCell<AlbumInfoSource, String> TableCell<Album, String> ,反之亦然。

    TableColumn<Album, String> 在你的方法中,你需要一个 TableCell<Album... TableCell<AlbumInfoSource... AlbumInfoSource ,因此更改单元格将不起作用。

    这意味着您需要通过泛型引入另一个间接层次。

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

    这意味着我们可以创建不同的通用版本 ,但须受 T 是一种更具体的 相册信息源

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

    另见 Oracle's generics tutorial