【发布时间】:2020-01-15 05:32:18
【问题描述】:
public interface A {}
public interface B {}
public class Test implements A{}
public class Test2 {}
我创建了一个方法来检查一个类是否实现了一个接口。我希望我的方法只接受通用接口而不是所有类对象。
方法
public static boolean containsInterface(Class clazz, Class intf)
{
try
{
Validate.isTrue(intf.isInterface());
if(clazz.isInterface())
return JavaUtil.isClassExtending(intf, clazz);
for(Class c : ClassUtils.getAllInterfaces(clazz))
{
if(JavaUtil.isClassExtending(intf, c))
return true;
}
}
catch(Throwable t)
{
t.printStackTrace();
}
return false;
}
由于 Test.class 和 Test2.class 不是 2d 参数上的接口,我希望它出现编译错误,因为 2d 参数必须是接口类
containsInterface(Test.class, Test.class);
containsInterface(Test.class, Test2.class);
我的方法可接受的使用
containsInterface(Test2.class, A.class);
containsInterface(Test.class, B.class);
我尝试过的
public static boolean containsInterface(Class clazz, Class<? extends Interface> intf)
我目前检查参数中的类是否是接口然后抛出异常。如果它不是接口,我宁愿强迫人们不能调用该方法开始
我知道 Annotations 和 Enum 对象可用作类签名,以确保人们正确使用参数,但我似乎找不到接口本身的参数。
有人告诉我泛型不支持接口或抽象类类型即使在 jre 9-13+ 中也是如此
【问题讨论】:
-
你能解释一下
containsInterface()应该做什么吗? -
它判断一个类是否有一个指定的接口。您输入接口类。我已经让它工作了我只想将 2d 接口参数强制为接口
-
重新打开该问题需要进行几次重新投票。给点时间吧。
-
作为对您的快速回答,没有用于强制静态将type作为接口的构造。
Class对象将包括接口(以及枚举和注释以及具体或抽象类等) -
另一个快速的答案是使用
intf.isAssignableFrom(clazz))(甚至instanceof),但这些检查几乎总是代码异味;这就是我们想知道用例的原因,因为可能有更好的方法。还要记住泛型(如<? extends Something>)在运行时不可用。
标签: java class parameters interface reflect