正确键入功能接口映射(Java 8)

xtr*_*dit 3 java generics lambda java-8

我正在尝试在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);
Run Code Online (Sandbox Code Playgroud)

最后两行不能使用以下(明显)错误进行编译:

- 方法length()未定义类型
Object-操作符+未定义参数类型Object,int

所以我的问题是当我在我的hashmap中存储lamda时如何指定转换器的TYPES F和T所以我不会被迫从Object转换所有内容?

Sot*_*lis 5

指定lambda参数的类型(F)

fooMapping.put("name", (String someString) -> someString.length());
fooMapping.put("flavor", (Integer someInt) -> someInt + 1);
Run Code Online (Sandbox Code Playgroud)

返回类型(T)将从lambda body表达式的类型推断出来.

  • @xtrakBandit不,类型擦除在这里没有影响.你明确地用通配符`?`键入你的`Converter`s.您已明确声明您要么不知道绑定的类型.如果你不知道,编译器怎么样? (3认同)
  • 不,你的`fooMapping`的类型是`HashMap <String,Converter <?,?>>`.`get`的返回类型是`Converter <?,?>`. (2认同)