泛型类型的函数接口可以存储在静态映射中吗



我使用了一个静态映射来存储一系列与三个类a、B和C相关联的函数接口,这三个类都是从父类继承的。代码运行平稳,如下所示:

private static final Map<Class<?>, BiConsumer> maps = Maps.newConcurrentMap();
@PostConstruct
public void init() {
maps.put(A.class, BiConsumerA);
maps.put(B.class, BiConsumerB);
maps.put(C.class, BiConsumerC);
}
private static BiConsumer<A, String> BiComsumerA = (a, string) -> {//do something}
private static BiConsumer<B, String> BiComsumerB = (b, string) -> {//do something}
private static BiConsumer<C, String> BiComsumerC = (c, string) -> {//do something}
public static<T extends Parent> void exec(T t, String string) {
maps.get(t.getClass()).accept(t, map);
}

然而,有一个警告";参数化类"BiConsumer"的原始使用;关于Biconsumer在静态映射中的使用。我尝试了各种方法将参数化类型添加到"BiConsumer"中,但没有成功。例如:

private static final Map<Class<?>, BiConsumer<?, String>> maps = Maps.newConcurrentMap();
private static final Map<Class<?>, BiConsumer<? extends Parent, String>> maps = Maps.newConcurrentMap();
private static final Map<Class<?>, BiConsumer<T, String>> maps = Maps.newConcurrentMap();
private static final Map<Class<?>, BiConsumer<T extends Parent, String>> maps = Maps.newConcurrentMap();

所以我的问题是:泛型类型的函数接口可以存储在静态映射中吗?如果答案是否定的,直接使用功能接口,这是在静态映射中使用功能接口的唯一方法吗?是否有更合适的实现?非常感谢你的帮助。

泛型类型的函数接口可以存储在静态映射中吗?

当然可以。为了演示,列表更容易:

private static List<Consumer<?>> listOfConsumers = new ArrayList<>();
@PostConstruct
public void init2() {
Consumer<String> stringConsumer = str -> System.out.println(str);
Consumer<Integer> intConsumer = i -> System.out.println(i);

listOfConsumers.add(stringConsumer);
listOfConsumers.add(intConsumer);
}

然而,有一个警告"参数化类"BiConsumer"的原始使用;

只需使用通配符而不是特定参数。

private static final Map<Class<?>, BiConsumer<?, String>> maps = Maps.newConcurrentMap();

最新更新