Vaadin Grid列设置泛型参数

时间:2018-04-06 07:50:01

标签: java generics grid vaadin

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

    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&lt; KPIBusinessDisplay,捕获#13-of?&gt; to Grid.Column&lt; KPIBusinessDisplay,CalendarConstants.FREQUENCYUNITTYPES&gt;

如果我尝试不同的方式:

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&lt; KPIBusinessDisplay类型中的方法setRenderer(ValueProvider&lt; capture#14-of?,P&gt;,Renderer&lt;?super P&gt;),捕获#14-of?&gt;不适用于参数(new ValueProvider&lt; CalendarConstants.FREQUENCYUNITTYPES,String&gt;(){},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&lt; T,V&gt;的引用应该参数化

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

1 个答案:

答案 0 :(得分:1)

发生编译器警告是因为编译器没有足够的类型信息来保证&#34;代码在运行时不会导致var client = new RestClient("https://example.com/openam/oauth2/access_token?grant_type=authorization_code&realm=/cbpgatqa"); var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); request.AddHeader("Cache-Control", "no-cache"); request.AddHeader("Authorization", "Basic MzE4OGQwYjQtZTRlOC00MTZjLTg5NjAtZDNlYWFhMmNjY2IxOkx3NiVBa0x4NWtPM01rJTJ5RWwxbW1jR0ZYZmhTQmk1NHhIRCpzNiUyVUd5WXN0MCNVbyNMNWQhcVlpZE93djc="); request.AddParameter("undefined", "code=" + AuthCode + "&redirect_uri=http%3A%2F%2Flocalhost%3A8080", ParameterType.RequestBody); IRestResponse response = client.Execute(request); using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(response.Content))) { // Deserialization from JSON DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Token)); Token token = (Token)deserializer.ReadObject(ms); return userinfo= GetuserInfo(token.id_token); } 。这样做的原因是你正在使用&#34;魔法&#34;用于标识bean属性的字符串。编译器无法知道&#34; ClassCastException引用"frequencyUnit"中的方法getFrequencyUnit(),因此也不知道您设置的渲染器是否兼容。

编译器警告基本上意味着如果将KPIBusinessDisplay的返回类型更改为返回渲染器无法处理的类型的值,编译器就无法发出警告。

如果您不想取消这些警告,您可以改为创建列,使编译器能够识别类型之间的关系:getFrequencyUnit()

键入的时间稍长,但如果更改Grid.Column<KPIBusinessDisplay, FREQUENCYUNITTYPES> frequencyUnitColumn = grid.addColumn(KPIBusinessDisplay::getFrequencyUnit);的返回类型,编译器可以立即为您检测问题。此外,如果在IDE中使用重构功能更改getFrequencyUnit的名称,则IDE还将自动更新getFrequencyUnit中的代码。如果使用字符串,则不会出现这种情况。