Java 8 函数式接口图的正确输入法

3
我将尝试在HashMap中存储字符串到函数的映射,并且我正在努力使类型匹配正确。如何存储由泛型函数接口定义的不同类型的函数?
以下是相关代码。
@FunctionalInterface
public interface Converter<F,T> {
    T convert(F from);
}

 HashMap<String, Converter<?, ?>> fooMapping= new HashMap<String, Converter<?, ?>>();

 fooMapping.put("name", (someString) -> someString);
 fooMapping.put("flavor", (someInt) -> someAge + 1);

最后两行代码无法编译,出现以下(显然的)错误:

-方法length()对于类型Object未定义
-运算符+对于参数类型Object、int未定义

我的问题是,当我将lambda存储在哈希映射中时,如何指定Converter的类型F和T,以便我不必从Object强制转换所有内容?


1
请注意,您可以直接使用java.util.function中的Function而不是使用Converter FInterface。HashMap<String, Function<?, ?>> fooMapping= new HashMap<String, Function<?, ?>>(); - user2336315
1个回答

5

指定lambda参数(F)的类型

fooMapping.put("name", (String someString) -> someString.length());
fooMapping.put("flavor", (Integer someInt) -> someInt + 1);

返回类型(T)将从lambda主体表达式的类型推断出来。

做错了!谢谢。如此显然,我感觉自己像个新手。再玩一下,我发现你还可以转换整个 lambda 表达式 (Converter<String, String>)(someInt) -> someInt + 1 - xtrakBandit
1
@xtrakBandit 当然,那将设置一个显式类型的目标函数接口。请注意,在 String 中,您将执行字符串连接操作。someInt 推断为 String 类型。 - Sotirios Delimanolis
感谢 @SotiriosDelimanolis。跟进问题:当我调用 fooMapping.get("someKey") 时,结果类型会是什么?Lambda 的确切类型是否会被保留? - xtrakBandit
2
不,你的 fooMapping 是类型为 HashMap<String, Converter<?,?>> 的。get 的返回类型将是 Converter<?,?> - Sotirios Delimanolis
再次感谢。所以我假设这是类型擦除的结果。有没有办法拥有一个混合类型的lambda集合并在不进行强制转换的情况下调用它们? - xtrakBandit
3
不需要类型擦除。您已经使用通配符“?”显式为“Converter”类型指定了类型。您已经明确表示您不知道绑定的类型是什么。如果您不知道,编译器又怎么会知道呢? - Sotirios Delimanolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接