java - 在java中使用嵌套泛型

标签 java vaadin nested-generics

在 Vaadin 8.5.1 中,我们有一个 Grid 组件,它具有向网格添加新列的方法。

<V> Grid.​Column<​T​,V>     addColumn(​ValueProvider<​T​,V> valueProvider)

完整的示例如下所示:

// Have some data
List<Person> people = Arrays.asList(
    new Person("Nicolaus Copernicus", 1543),
    new Person("Galileo Galilei", 1564),
    new Person("Johannes Kepler", 1571));

// Create a grid bound to the list
Grid<Person> grid = new Grid<>();
grid.setItems(people);
grid.addColumn(Person::getName).setCaption("Name");
grid.addColumn(Person::getBirthYear).setCaption("Year of birth");

layout.addComponent(grid);

这工作得很好。 但我现在尝试实现的是,当 Person 类扩展另一个对大多数对象来说很常见的类时。

例如:

public class NamedClass
{
    ...
    public String getName()
    {
        return name;
    }
}

public class Person extends NamedClass
{
    ...
    public int getBirthYear()
    {
         return birthYear;
    }
}

现在我希望创建一个网格辅助类,它的作用是

grid.addColumn(NamedClass::getName).setCaption("Name");

对于所有后代类,其他属性均由我的扩展处理。

我尝试过:

public class ANamedGridHelper<T extends NamedClass> {

    public Column<T, ?> mapProperties(Grid grid) {
       return grid.addColumn(NamedClass::getName).setId("name");
    }
}

 public class PersonGridHellper<Person>
 {
     ----
 }

但它不会编译 ANamedGridHelper

org/aarboard/gridtest1/ANamedGridHelper.java:[19,19] no suitable method found for addColumn(NamedClass::getName)
    method com.vaadin.ui.Grid.addColumn(java.lang.String) is not applicable
      (argument mismatch; java.lang.String is not a functional interface)
    method com.vaadin.ui.Grid.addColumn(com.vaadin.data.ValueProvider) is not applicable
      (argument mismatch; invalid method reference
          method getName in class org.aarboard.gridtest1.NamedClass cannot be applied to given types
            required: no arguments
            found: java.lang.Object
            reason: actual and formal argument lists differ in length)
org/aarboard/gridtest1/ANamedGridHelper.java:[19,30] invalid method reference
  non-static method getName() cannot be referenced from a static context

最佳答案

T 的编译器类型未知。由于方法 getName 来自 NamedClass,因此您必须在方法 `ANamedGridHelper::mapProperties:

中执行相同的操作
public class ANamedGridHelper<T extends NamedClass> {
    public Column<T, ?> mapProperties(Grid<T> grid, T bo) {
       return grid.addColumn(NamedClass::getName).setId("name");
    }
}

一些注释:

  • 具有 abstract 方法的类也必须是 abstract
  • 抽象方法没有主体 - 没有实现并等待被覆盖。

我还必须添加到该方法的 Grid 参数,现在它按预期工作。

关于java - 在java中使用嵌套泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51845417/

相关文章:

java - 使用 Spring 在 JSP 上显示值列表

java - 将更改保存到数据库 vaadin

c# - 为什么 C# 不支持泛型的泛型(具有参数化类型的泛型)?

java - 如何在不触摸 ListView 中选择/突出显示项目?

java - 期间.仅减去天数

java - 使用适配器中的不同数据更新不同 ListView 中的常见帖子

java - 在 Vaadin 中使用库 : com. vaadin.server.ServiceException

java - 单击国际化按钮后如何重新加载Vaadin中的组件?

java - 泛型树,自界泛型

c# - 为什么不能推断出嵌套的泛型类型?