java - 动态检查实例是否实现了接口(interface)

标签 java dynamic implements

<分区>

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

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

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”函数时,我无法弄清楚第二个参数必须是什么类型。我正在尝试传递所提供的类将针对其进行测试的接口(interface),但据我所知,没有可用于以这种方式传递接口(interface)的变量类型。

是否可以通过这种方式将接口(interface)作为参数传递,或者我应该开始探索替代方案?

最佳答案

解释

您需要将接口(interface)作为 Class ( documentation ) 标记传递。另外,您需要检查相反的方法:interfaceToTestAgainst.isInstance(classToTest)。目前,您正在尝试检查接口(interface)是否是该类的实例。

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 问题。可能有更好的解决方案来解决您在首先尝试解决的问题。

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

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

关于java - 动态检查实例是否实现了接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753372/

相关文章:

php - 想要为 MailChimp 提供动态内容?

class - Kotlin:如何让 Android Studio 在类的底部实现接口(interface)的功能

java - 为什么我们在实现 Interface 方法时使用 @Override ?它真的重写了方法吗?

java - 如何在 webDriver 测试中将 ExpectedConditions 类与已实现的类结合起来

JAVA:创建 boolean 变量或在 If 语句中放置参数?

java - 存储桶 "XXX"的帐户已被禁用

c# - “ExpandoObject”不包含 'PropertyChanged' 的定义

java - 如何从 java 类路径中排除特定的 jar

java - Android Google Map - 错误膨胀类 fragment

java - Git 是离开 WIP 分支并开始在另一个分支上工作的更好方法