猿问

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

说有两个班级Foo和Bar。它们不扩展相同的类(该类除外Object)或实现相同的接口。但是,它们两者都具有具有相同签名的方法。这些课程不是我的。它们无法更改。有没有一种方法可以对某种方法使用某种通用调用,meth就像这两个类扩展了相同的类或实现了相同的接口一样?


class Foo {


    public void meth(String s) {

    }

}


class Bar {


    public void meth(String s) {

    }

}


杨魅力
浏览 244回答 2
2回答

哔哔one

您可以使用反射,但不能输入安全。根据对象的运行时间,您可以调用特定的方法。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();    }

凤凰求蛊

在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")。
随时随地看视频慕课网APP

相关分类

Java
我要回答