为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

忽然笑 2023-06-08 20:48:16
我正在尝试学习一些我认为更复杂的 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 mapprotected final Map<Class<?>, ContextResolver<?, R>> contextMap = new HashMap<>();// The register classpublic <T> void registerContext(Class<T> context, ContextResolver<T, R> supplier) {    contextMap.put(context, supplier);}我试着做了类似的东西,但我还是不太明白。我想做更多的研究,但此时我不知道要搜索什么。不知道这种方法存储或者方法声明叫什么。我看了一些视频并阅读了一些关于 Java 中的泛型的文章,但大部分都非常基础,我设法理解了这些,但仍然无法弄清楚它是如何工作的。我期望的结果是能够调用contextMap.get(class).run(),它会调用该方法。编辑:PS:我不是要任何人为我编写代码或做这个或那个,只是为了指出正确的学习方向,剩下的我会自己做。或者也许是一些关于泛型的小解释。
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

在 Java 8 中,很少有功能接口可以帮助实现这种功能:Function, Supplier,Consumer和Runnable(较旧的)。


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<?, ?>>。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信