【问题标题】:Check dynamically whether instance implements interface [duplicate]动态检查实例是否实现接口[重复]
【发布时间】:2019-04-18 20:32:42
【问题描述】:

我正在尝试创建一个函数,它接受两个参数 - 一个类实例和一个接口 - 如果提供的类实例实现了提供的接口,则返回 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”函数时,我无法弄清楚第二个参数必须是什么类型。我正在尝试传递所提供的类将对其进行测试的接口,但据我所知,没有可用于以这种方式传递接口的变量类型。

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

【问题讨论】:

  • 听起来像是 XY 问题。首先可能有更好的解决方案来解决您试图通过此尝试解决的问题。如果可以避免的话,丢失类型信息、将系统降级为不再是编译时安全的系统通常是非常糟糕的。考虑重新思考/设计你的方法。不过请注意,我不知道您首先要解决什么问题。

标签: java dynamic implements


【解决方案1】:

说明

您需要将接口作为Class (documentation) 令牌传递。此外,您需要检查相反的方式: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 问题。可能有更好的解决方案来解决您试图通过此尝试解决的问题首先。

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

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

【讨论】:

  • 这是我一直在寻找的解决方案,是的 - 我知道这个问题有点宽泛,我会尝试编辑我的问题,以便将来能够帮助其他人。
【解决方案2】:

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

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

在实例的情况下,使用 instance.getClass() 即

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

【讨论】:

  • 您可能希望避免使用对语言具有特殊含义的变量名称,例如 implements。 SO 的语法高亮也因此而感到困惑。
  • 你是对的,只是输入它没有测试......
猜你喜欢
  • 2018-10-19
  • 2010-09-21
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多