java - 泛型 - 如何定义仅采用实现特定接口的类的方法
问题描述
我有一个目前看起来像这样的方法:
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
目前它可以参加任何类型的课程。我想限制它(在编译时),以便它只能允许一组有限的类。
所以我想我可以定义一个这样的接口:
public interface GettableBean<T> {}
并将代码更改为此(看起来很可怕的演员):
public static <T> T getBean(GettableBean<T> clazz) {
return (T) applicationContext.getBean(clazz.getClass());
}
当我尝试使用实现 GettableBean 的类来调用它时,更重要的是
public class MyClass implements GettableBean<MyClass>
我得到一个编译错误:
错误:(119, 27) java: 类 BeanLocator 中的方法 getBean 不能应用于给定类型;必需:GettableBean 找到:java.lang.Class 原因:无法推断类型变量 T(参数不匹配;java.lang.Class 无法转换为 GettableBean)
我在这里做错了什么?
解决方案
我不知道你为什么认为GettableBean
需要参数化。它只是一个标记界面。
删除多余的泛型类型参数并为方法添加约束getBean
。
public interface GettableBean {}
public class MyClass implements GettableBean {}
public static <T extends GettableBean> T getBean(Class<T> clazz) {}
此参数的名称应该是您的线索,即您尝试的方法并不是真正正确的方法:
public static <T> T getBean (GettableBean<T> clazz)
AGettableBean
不是一个类。这是一个例子。应该叫它gettableBean
。当您重命名它时,更清楚的是您传递一个实例只是几乎立即忽略了该实例的所有内容。
推荐阅读
- sql-server - 无法从 Azure 数据库迁移服务访问本地服务器的网络共享路径
- linux - tcsh 脚本中设置的环境变量不适用于 bash 脚本
- jenkins - Jenkinsfile 中的 Anaconda
- weaviate - 为 Weaviate 架构中的属性选择正确的名称
- r - 尝试使用循环对列表中的向量进行排序时的奇怪行为
- java - 如何将不带前缀的 childElements 添加到 Soap 标头?
- matlab - 如何向量化二维矩阵每一行的外积矩阵的评估?
- python - 查找熊猫数据框中出现次数最多的 timedelta 小时
- php - 使用php在会话中存储表单数据
- sql - 如何优化 sql 查询以提高性能