java - 在java中使用嵌套泛型
问题描述
在 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
。 abstract
方法没有主体 - 没有实现并等待被覆盖。
我还必须将 Grid 添加到方法的参数中,现在它可以按预期工作。
推荐阅读
- javascript - 无法让 jQuery 动画与 ASP.NET 母版页一起使用
- mysql - 另一个表中存在的sql查询条目
- google-static-maps - 即使使用 API 密钥,Google Maps Static API 403
- r - 如何抓取csvs文件夹的部分文件名并将该名称作为列插入到R中的数据框中
- r - 省略 RColorBrewer 调色板上较亮的颜色以在 ggplot2 中使用
- https - Crawlera HTTPS 页面永久超时
- reactjs - 创建反应应用程序(打字稿)将环境文件添加到生产构建
- bash - 字符串中的 Bash 回显变量总是有空格
- javascript - Internet Explorer 11 - 动态 SVG 创建
- dpdk - DPDK RX/TX 回调示例应用程序中没有出现流量