gpt4 book ai didi

java - 使用泛型在 Map 中存储和调用方法

转载 作者:行者123 更新时间:2023-11-30 05:31:07 25 4
gpt4 key购买 nike

我正在尝试学习一些我认为更复杂的 Java,我对泛型感兴趣,因为我注意到它可以做一些令人惊奇的事情。我想过这样做:有一个 Map 来存储一个类和某种形式的方法,这将在给出某个类的情况下使用,比如说 String.class 它将运行方法内的代码。

我看到它正在完成并正在开发一个名为 ACF 的项目(Aikar命令框架)。

如何注册新方法的示例:

registerContext(char.class, c -> {
String s = c.popFirstArg();
if (s.length() > 1) {
throw new InvalidCommandArgument(MessageKeys.MUST_BE_MAX_LENGTH, "{max}", String.valueOf(1));
}
return s.charAt(0);
});

他的注册方法看起来很简单:

// The map
protected final Map<Class<?>, ContextResolver<?, R>> contextMap = new HashMap<>();
// The register class
public <T> void registerContext(Class<T> context, ContextResolver<T, R> supplier) {
contextMap.put(context, supplier);
}

我尝试制作类似的东西,但我无法真正理解。我想做更多研究,但目前我不知道要搜索什么。我不知道这种类型的方法存储或者方法声明叫什么。我观看了一些视频并阅读了一些关于 Java 中泛型的文章,但大部分内容都非常基础,我设法理解,但仍然无法弄清楚它是如何工作的。我期望的结果是能够调用 contextMap.get(class).run() 并调用该方法。

编辑:
PS:我并不是要求任何人为我编写代码或做这做那,只是为我指明正确的学习方向,剩下的我会自己做。或者也许是一些关于泛型的小解释。

最佳答案

在 Java 8 中,很少有函数接口(interface)可以帮助实现此类功能: Function , Supplier , ConsumerRunnable (较旧)。

Runnable只是一段要运行的代码,没有输入,没有输出。您可能以前见过它:创建一个新的 Thread您需要提供Runnable然后是新的 Thread调用该代码。 Supplier是类似的东西,但它返回一个值。 Consumer接受输入,但不返回任何内容。 Function有输入和输出,在您的示例中使用了类似的东西。

所以基本上,根据您的需要,您可以创建方法映射,其中键是方法的名称,值是可运行的(要运行的代码段)-Map<String, Runnable> .

Map<String, Runnable> methodMap = new HashMap<>();
methodMap.put("say hello", () -> System.out.println("Hello"));
methodMap.put("say goodbye", () -> System.out.println("Goodbye"));

methodMap.get("say hello").run();

所有这些都与泛型有一点关系,但想象一下您想要存储带有输入和输出的方法,这就会出现问题。你需要像 Map<String, Function<?, ?>> 这样的东西.

关于java - 使用泛型在 Map 中存储和调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57538009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com