动态检查实例是否实现了接口
Check dynamically whether instance implements interface
我正在尝试创建一个带有两个参数的函数 - 一个 class 实例和一个接口 - 如果提供的 class 实例实现了提供的接口,则 returns 为真。 我的问题是我找不到以这种方式将接口作为参数传递的方法。
我的尝试目前看起来像这样:
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 将针对其进行测试的接口,但据我所知,没有可用于以这种方式传递接口的变量类型。
是否可以通过这种方式将接口作为参数传递,或者我应该开始探索替代方案?
说明
您需要将接口作为 Class
(documentation) 令牌传递。另外,您需要检查相反的方式:interfaceToTestAgainst.isInstance(classToTest)
。当前,您正在尝试检查接口是否是 class.
的实例
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 问题。可能有 更好的解决方案 来解决您在 首先 .
尝试解决的问题
丢失类型信息,将系统降级为编译时不安全的系统通常非常糟糕,如果它可以避免。
考虑re-thinking/-designing你的方法。不过请注意,我不知道您想首先解决什么问题。
您不需要为此创建方法。简单使用
boolean doesImplement = ITest.class.isAssignableFrom(Test.class)
例如,使用 instance.getClass() 即
boolean doesImplement = ITest.class.isAssignableForm(testObj.getClass())
我正在尝试创建一个带有两个参数的函数 - 一个 class 实例和一个接口 - 如果提供的 class 实例实现了提供的接口,则 returns 为真。 我的问题是我找不到以这种方式将接口作为参数传递的方法。
我的尝试目前看起来像这样:
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 将针对其进行测试的接口,但据我所知,没有可用于以这种方式传递接口的变量类型。
是否可以通过这种方式将接口作为参数传递,或者我应该开始探索替代方案?
说明
您需要将接口作为 Class
(documentation) 令牌传递。另外,您需要检查相反的方式:interfaceToTestAgainst.isInstance(classToTest)
。当前,您正在尝试检查接口是否是 class.
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 问题。可能有 更好的解决方案 来解决您在 首先 .
尝试解决的问题丢失类型信息,将系统降级为编译时不安全的系统通常非常糟糕,如果它可以避免。
考虑re-thinking/-designing你的方法。不过请注意,我不知道您想首先解决什么问题。
您不需要为此创建方法。简单使用
boolean doesImplement = ITest.class.isAssignableFrom(Test.class)
例如,使用 instance.getClass() 即
boolean doesImplement = ITest.class.isAssignableForm(testObj.getClass())