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

泛型调用不同类中的方法,但具有相同的方法签名

泛型调用不同类中的方法,但具有相同的方法签名

杨魅力 2021-04-11 18:15:09
说有两个班级Foo和Bar。它们不扩展相同的类(该类除外Object)或实现相同的接口。但是,它们两者都具有具有相同签名的方法。这些课程不是我的。它们无法更改。有没有一种方法可以对某种方法使用某种通用调用,meth就像这两个类扩展了相同的类或实现了相同的接口一样?class Foo {    public void meth(String s) {    }}class Bar {    public void meth(String s) {    }}
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以使用反射,但不能输入安全。根据对象的运行时间,您可以调用特定的方法。


import java.lang.reflect.Method; 


try 

    {

        Object f1 = new Foo();

        Object f2 = new Bar();


        Class c1 = f1.getClass();

        Class[] param = new Class[1];   

        param[0] = String.class;

        Method method;

        method = c1.getDeclaredMethod("meth", param);

        method.invoke(f1, "$$$$$$$$$$$$$$");


    } catch (NoSuchMethodException | SecurityException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IllegalAccessException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IllegalArgumentException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (InvocationTargetException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }


查看完整回答
反对 回复 2021-04-28
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

在Java 8或更高版本中,可以使用方法引用。


Foo myFoo = ...;

Bar myBar = ...;


Consumer<String> fn1 = myFoo::meth;

Consumer<String> fn2 = myBar::meth;

将适当的传递Consumer<String>到您要调用该方法的地方。


Consumer<String>适用于具有一个字符串参数且没有返回类型的方法。如果您的方法签名不同,那么还有许多其他功能接口可能会更好地匹配。


给定a Consumer<String> fn,您可以使用调用引用的方法fn.accept("abc")。


查看完整回答
反对 回复 2021-04-28
  • 2 回答
  • 0 关注
  • 243 浏览

添加回答

举报

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