【问题标题】:Vaadin Grid column setting generics argumentsVaadin Grid 列设置泛型参数
【发布时间】:2018-04-06 07:50:00
【问题描述】:

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

    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.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()
        );

我在 setRenderer 收到错误:

Grid.Column 类型中的方法 setRenderer(ValueProvider, Renderer super P>) 不适用于参数(新ValueProvider(){}, TextRenderer)

如果我这样使用它:

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()
        );

然后我收到警告:

类型安全:方法 setRenderer(ValueProvider, Renderer) 属于原始类型 Grid.Column。对泛型 Grid.Column 的引用应该被参数化

如何在不引发错误的情况下修复警告?

【问题讨论】:

    标签: java generics grid vaadin


    【解决方案1】:

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

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

    如果您不想抑制这些警告,则可以改为以使编译器了解类型之间关系的方式创建列:Grid.Column&lt;KPIBusinessDisplay, FREQUENCYUNITTYPES&gt; frequencyUnitColumn = grid.addColumn(KPIBusinessDisplay::getFrequencyUnit);

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

    【讨论】:

    • 像魅力一样工作。我只需要添加setId 即可使该列像以前一样工作:Grid.Column&lt;KPIBusinessDisplay, FREQUENCYUNITTYPES&gt; frequencyUnitColumn = grid.addColumn(KPIBusinessDisplay::getFrequencyUnit).setId("frequencyUnit");
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2013-11-24
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多