动态检查实例是否实现接口

时间:2019-04-18 20:32:42

标签: java dynamic implements

我试图创建一个带有两个参数的函数-一个类实例和一个接口-如果提供的类实例实现了提供的接口,则返回true。 我的问题是我找不到以这种方式将接口作为参数传递的方法。

我的尝试目前看起来像这样:

interface myInterface
{
}

class myClass implements myInterface
{
}

...

// Function to check if a class implements an interface:
boolean doesImplementInterface(object classToTest, ??? interfaceToTestAgainst)
{
    if(i.getClass().isInterface())
    {
        return o.getClass().isInstance(i);
    }
    return false;
}

...

// Would call the "doesImplementInterface" method like this:
doesImplementInterface(new myClass(), myInterface);

在这里可能很难看到,但是在定义“ doesImplementInterface”函数时,我无法弄清楚第二个参数必须是什么类型。我试图传递将要测试所提供的类的接口,但据我所知,没有可用于以这种方式传递接口的变量类型。

是否可以通过这种方式将接口作为参数传递,还是应该开始探索替代选项?

2 个答案:

答案 0 :(得分:3)

说明

您需要将接口作为Classdocumentation)令牌进行传递。另外,您需要检查相反的方式:interfaceToTestAgainst.isInstance(classToTest)。当前,您正在尝试检查接口是否是该类的实例。

boolean doesImplementInterface(Object classToTest, Class<?> interfaceToTestAgainst) {
    if (!interfaceToTestAgainst.isInterface()) {
        return false;
    }
    return interfaceToTestAgainst.isInstance(classToTest);
}

或一行:

boolean doesImplementInterface(Object classToTest, Class<?> interfaceToTestAgainst) {
    return interfaceToTestAgainst.isInterface()
        && interfaceToTestAgainst.isInstance(classToTest);
}

更改了命名:

boolean isInstanceOfInterface(Object obj, Class<?> interfaceToken) {
    return interfaceToken.isInterface()
        && interfaceToken.isInstance(obj);
}

该方法的调用:

boolean result = isInstanceOfInterface(new Dog(), CanBark.class);

注意

您的问题听起来像是 XY问题。可能会有更好的解决方案来解决您尝试通过第一名进行的尝试。

丢失类型信息,如果可以避免的话,将系统降级为不是编译时安全的,通常会非常糟糕

请重新考虑/设计您的方法。不过请注意,首先我不知道您要解决什么。

答案 1 :(得分:1)

您无需为此创建方法。简单使用

boolean doesImplement = ITest.class.isAssignableFrom(Test.class)

如果是实例,请使用instance.getClass()即

boolean doesImplement = ITest.class.isAssignableForm(testObj.getClass())