我想把一系列的方法引用保存在一个映射(Map)里,它们都是类的getter方法,但是并不全都属于同一个类,返回值也不全都相同,这是几个示例:User::getUsername、Group::getName、Post::getId。我知道可以用函数式接口接收单个方法引用,例如:Function<User, String> getUsername = User::getUsername、Function<Post, Long> getId = Post::getId。但是我在声明容纳函数式接口的映射的时候遇到了困难,因为接收这些方法引用的函数式接口的第一个泛型参数和第二个泛型参数不全相同。
使用IDEA的代码提示解决了。方法是这样的:在新的一行输入Arrays.asList(getUsername, getId),在其后再输入.var并按回车键,IDEA会自动提示出这个列表的类型和变量名。IDEA提示的类型是:List<? extends Function<?, ?>>。
映射可以使用类似的声明,不过我做了简化。我声明的映射类型声明是:Map<String, Function<?, ?>>。要存入方法引用需要经过类型转换,例如存入Group::getId应该这样写:map.put("id", (Function<Group, Long>) Group::getId)。