java - Java 通用类< ? 扩展接口>作为参数
问题描述
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+ 中也是如此
解决方案
您不能使用类型控制系统将参数强制为任何接口实现。如果您只想Class<?>
使用abstract
修饰符强制,则同样适用。我不确定这是否真的需要,因为做简单类型isInterface
断言是
- 直截了当
- 干净的
- 强大的
- 容易理解
- 容易出错
- 可测试
JDK 工程师也不关心这一点。将使用这种机制的一个完美示例(但没有)是 JDK 动态代理创建。您只能创建一个接口(或一组)的代理,但不能创建类。
我认为编写自己的前处理器并不值得。此外,它不是通用的-因为您假设必须在编译时知道运行时类型-动态加载的类等呢?
推荐阅读
- codeigniter - 如何在codeigniter中发送带有动态视图文件附件的电子邮件?
- jquery - 触发以名称为变量名的函数
- arrays - 如何将整数扫描到方阵(二维数组)中?(编译前矩阵大小未知)
- python - 在 Python 中使用 selenium 时出现在网站上,但当我手动访问网站时不会出现
- scala - Marshall Javascript Array to Seq[Any] with Spray JSON
- java - 如何比较两个文件以查看它们是否相同?
- javascript - 限制来自动态数据源的 html 元素的数量
- css - 模态框上的 Angular5 PrimeNG 数据表,模态框后面显示 ContextMenu
- windows - 如何使 CertUtil 递归地进入我的文件夹和子文件夹
- sql - 无法远程连接到 SQL Server