Java Vaadin网格列设置泛型参数

Java Vaadin网格列设置泛型参数,java,generics,grid,vaadin,Java,Generics,Grid,Vaadin,我想删除代码中的警告。我尝试了以下两个更改: grid = new MyGrid<>(KPIBusinessDisplay.class); grid.setColumns(); grid.addColumn("frequency"); Grid.Column<KPIBusinessDisplay, FREQUENCYUNITTYPES> frequencyUnitColumn = grid.addColumn("frequency

我想删除代码中的警告。我尝试了以下两个更改:

    grid = new MyGrid<>(KPIBusinessDisplay.class);

    grid.setColumns();
    grid.addColumn("frequency");    
    Grid.Column<KPIBusinessDisplay, FREQUENCYUNITTYPES> frequencyUnitColumn = grid.addColumn("frequencyUnit");

    frequencyUnitColumn.setRenderer(new ValueProvider<FREQUENCYUNITTYPES, String>()
    {
        private static final long serialVersionUID = 6833675800012389627L;

        @Override
        public String apply(FREQUENCYUNITTYPES source) {
            return messageByLocaleService.getMessage(source.name());
        }}, new TextRenderer()
    );
grid=newmygrid(KPIBusinessDisplay.class);
grid.setColumns();
网格。添加列(“频率”);
Grid.Column frequencyUnitColumn=Grid.addColumn(“frequencyUnit”);
frequencyUnitColumn.setRenderer(新的ValueProvider()
{
私有静态最终长serialVersionUID=6833675800012389627L;
@凌驾
公共字符串应用(FREQUENCYUNITTYPES源){
返回messagebylocalService.getMessage(source.name());
}},新文本渲染器()
);
在这种情况下,我在分配grid.addColumn返回值时出错:

类型不匹配:无法从Grid.Column转换为Grid.Column

如果我尝试不同的方法:

Grid.Column<KPIBusinessDisplay, ?> frequencyUnitColumn = grid.addColumn("frequencyUnit");

        frequencyUnitColumn.setRenderer(new ValueProvider<FREQUENCYUNITTYPES, String>()
        {
            private static final long serialVersionUID = 6833675800012389627L;

            @Override
            public String apply(FREQUENCYUNITTYPES source) {
                return messageByLocaleService.getMessage(source.name());
            }}, new TextRenderer()
        );
Grid.Column frequencyUnitColumn=Grid.addColumn(“frequencyUnit”);
frequencyUnitColumn.setRenderer(新的ValueProvider()
{
私有静态最终长serialVersionUID=6833675800012389627L;
@凌驾
公共字符串应用(FREQUENCYUNITTYPES源){
返回messagebylocalService.getMessage(source.name());
}},新文本渲染器()
);
我在setRenderer上得到错误:


方法setRenderer(ValueProvider,Renderer编译器警告之所以发生,是因为编译器没有足够的类型信息来“保证”代码在运行时不会导致
ClassCastException
。原因是您正在使用“魔术”字符串来标识bean属性。编译器无法“知道”
“frequencyUnit”
引用了
KPIBusinessDisplay
中的方法
getFrequencyUnit()
,因此它也不知道您正在设置的渲染器是否兼容

编译器警告基本上意味着,如果将
getFrequencyUnit()
的返回类型更改为呈现程序无法处理的类型的返回值,编译器将无法警告您

如果您不想抑制这些警告,您可以改为以使编译器知道类型之间关系的方式创建列:
Grid.column frequencyUnitColumn=Grid.addColumn(KPIBusinessDisplay::getFrequencyUnit);


输入时间稍长,但其好处是,如果更改
getFrequencyUnit
的返回类型,编译器可以立即为您检测问题。此外,如果使用IDE中的重构功能更改
getFrequencyUnit
的名称,则IDE也会自动更新
中的代码>addColumn
。如果使用字符串,则不会出现这种情况。

编译器出现警告是因为编译器没有足够的类型信息来“保证”代码在运行时不会导致
ClassCastException
。原因是您使用的是“魔术”用于标识bean属性的字符串。编译器无法“知道”
中的“frequencyUnit”
引用了
KPIBusinessDisplay
中的方法
getFrequencyUnit()
,因此它也可能不知道您正在设置的呈现程序是否兼容

编译器警告基本上意味着,如果将
getFrequencyUnit()
的返回类型更改为呈现程序无法处理的类型的返回值,编译器将无法警告您

如果您不想抑制这些警告,您可以改为以使编译器知道类型之间关系的方式创建列:
Grid.column frequencyUnitColumn=Grid.addColumn(KPIBusinessDisplay::getFrequencyUnit);


输入时间稍长,但其好处是,如果更改
getFrequencyUnit
的返回类型,编译器可以立即为您检测问题。此外,如果使用IDE中的重构功能更改
getFrequencyUnit
的名称,则IDE也会自动更新
中的代码>addColumn
。如果使用字符串,则不会出现这种情况。

就像一个符咒一样工作。我只需添加
setId
即可使该列像以前一样工作:
Grid.column frequencyUnitColumn=Grid.addColumn(KPIBusinessDisplay::getFrequencyUnit).setId(“frequencyUnit”)
工作起来很有魅力。我只需添加
setId
就可以使列像以前一样工作:
Grid.column frequencyUnitColumn=Grid.addColumn(KPIBusinessDisplay::getFrequencyUnit).setId(“frequencyUnit”);
Grid.Column frequencyUnitColumn = grid.addColumn("frequencyUnit");

        frequencyUnitColumn.setRenderer(new ValueProvider<FREQUENCYUNITTYPES, String>()
        {
            private static final long serialVersionUID = 6833675800012389627L;

            @Override
            public String apply(FREQUENCYUNITTYPES source) {
                return messageByLocaleService.getMessage(source.name());
            }}, new TextRenderer()
        );