java - 动态检查实例是否实现接口
问题描述
我正在尝试创建一个函数,它接受两个参数——一个类实例和一个接口——如果提供的类实例实现了提供的接口,则返回 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”函数时,我无法弄清楚第二个参数必须是什么类型。我正在尝试传递所提供的类将对其进行测试的接口,但据我所知,没有可以用来以这种方式传递接口的变量类型。
是否可以以这种方式将接口作为参数传递,或者我应该开始探索替代选项?
解决方案
解释
您需要将接口作为Class
(文档)令牌传递。此外,您需要检查相反的方式: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 问题。首先可能有更好的解决方案来解决您试图通过此尝试解决的问题。
如果可以避免的话,丢失类型信息、将系统降级到不再是编译时安全的系统通常是非常糟糕的。
考虑重新思考/设计你的方法。不过,请注意,我不知道您首先要解决什么问题。
推荐阅读
- ruby-on-rails - Rails:接收和发送图像
- c# - 如何校准 UWP 应用以进行投影
- excel - 如何发送keys unicode字符VBA - 没有剪贴板
- ansible - Ansible Playbook 使用具有一个或多个值的列表/字典
- hadoop - Spring Cloud 数据流 - http | 卡夫卡和卡夫卡| hdfs - 在 HDFS 中获取原始消息
- swift - Swift4:如何更改 UITableView 单元格颜色
- python - 如何从文件路径列表生成python dict
- ios - 在swift ios中将视图旋转角度重置为零
- sql - SQL Postgres - 插入不存在的地方
- makefile - CMAKE - 包含具有特殊字符的目录