代码之家  ›  专栏  ›  技术社区  ›  André Schild

在java中使用嵌套泛型

  •  1
  • André Schild  · 技术社区  · 8 年前

    在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");
    

    对于所有的子类,所有其他属性都由我的a扩展来处理。

    我试过:

    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
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   André Schild    8 年前

    编译器类型未知 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 方法必须是 也。
    • 一个 方法没有正文-没有实现,等待被重写。

    我还必须将添加到方法的网格参数中,现在它可以按预期工作了。