当前位置: 首页 > 知识库问答 >
问题:

接受不同功能接口类型的Java方法-可能吗?

云承天
2023-03-14
    @FunctionalInterface
    public interface OneArgCall<T, U, A> {
        T execute(U u, A arg);
    }

    @FunctionalInterface
    public interface TwoArgCall<T, U, A, B> {
        T execute(U u, A arg, B arg2);
    }

    public <T, U, A, B> T execCall(String x, Class<U> c, OneArgCall<T, U, A> call, A arg) {
        U u = doSomething(x, c);
        try {
            return call.execute(u, arg);
        } catch (SomeException se) {
           handleSe(se);
        } catch (SomeOtherException soe) {
           handleSoe(soe);
    }
    
    public <T, U, A, B> T execCall(String x, Class<P> c, TwoArgCall<T, U, A, B> call, A arg, B arg2) {
        U u = doSomething(x, c);
        try {
            return call.execute(u, arg, arg2);
        } catch (SomeException se) {
           handleSe(se);
        } catch (SomeOtherException soe) {
           handleSoe(soe);
    }

所以,以所有枯燥的名义:您将如何清理这些代码?我想像一些类似于t execCall(String x,classc,something,SOMETHING_ELSE)的东西,其中可以是OneArgCall、twoargcall...接口和SOMETHING_ELSE表示列表(?)争论。

这完全可以做到吗?或者有没有其他方法可以重构这个代码,使其不那么令人同情?


共有1个答案

翟京
2023-03-14

您实际上并不需要所有这些接口。您不需要接受任何额外的方法参数。所有这些都可以由调用方使用lambda语法来处理。

这是您唯一需要的方法:

public <T, U> T execCall(String x, Class<U> c, Function<U, T> call) {
    U u = doSomething(x, c);
    try {
        return call.apply(u);
    } catch (SomeException se) {
       handleSe(se);
    } catch (SomeOtherException soe) {
       handleSoe(soe);
    }
}

现在,假设您有一个接受多个参数的方法,您希望使用execcall(),这是如何工作的?

public Foo someMethodCall(Bar bar, Arg1 a1, Arg2 a2) { .... }

Arg1 a1 = ...;
Arg2 a2 = ...;
String x = ...;
Bar b = execCall(x, Bar.class, (u) -> someMethodCall(u, a1, a2));
 类似资料:
  • 为了丰富运营体验,让开发者更好的体验积分商城功能,兑吧提支持更多的扩展功能 . 支持的扩展功能包含: 1. 游客用户唤醒登录 2. 自有虚拟商品充值 接口说明 充值接口API文档 通知接口API文档 3.加积分接口 接口说明 API文档 4.免登URL自定义参数 dcustom参数 transfer参数 signKeys参数 5. 会员等级功能 6.前置商品查询接口 7. 【秒杀商品】前置查询接口

  • 在编写了自己的通用功能接口并将其用于lambdas之后,我必须在一种新方法中使用它: 将通用数组作为输入处理,检查其最小长度是否为4 处理我的功能界面的任何实例 处理lambda表达式的任何实例,该表达式接受一个参数,但不返回任何内容 应用于函数接口实例的结果(这里我想我必须使用使用者) 以前从未使用过函数接口,有人能解释一下我应该如何将2个函数接口作为方法参数传递吗? 例如:

  • 问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在

  • 我想通过google play services lib更改GoogleAdMobAdsSdk,但是当我删除GoogleAdMobAdsSdk时,我出现了一个错误:AdListener类型不能是GameActivity的超接口;超接口必须是接口。 你能帮帮我吗! PS:您可以在这里找到一部分代码:迁移到新的google play服务库 提前感谢!

  • 问题内容: 我正处于起步阶段,想全神贯注于Go。目前,我正在模拟一个API请求,该请求返回一个包含对象数组的JSON格式的字符串。我正在尝试找出最合适的方法来遍历每个记录并访问每个字段。最终,每个字段都将被写入Excel电子表格,但是现在我只想打印每个字段的键和值。 这就是我所拥有的(我会在Go Playground中提供它,但不支持HTTP请求): 一切工作正常,直到尝试循环访问包含每个记录的属

  • 开发者只需对接完成免登接口、扣积分接口和兑换结果通知接口三个必选接口即可实现商城的基本功能,包括兑换商品,发布积分商城活动等 1.免登录地址接口 用户通过服务端生成的免登录url跳转到积分商城 接口说明 API文档 常见问题 2.扣积分接口 用户点击马上兑换,兑吧向开发者发起兑换请求,开发者进行json响应 接口说明 API文档 常见问题 3.兑换结果通知接口 兑吧把订单的状态通知给开发者,开发者