首页 > 解决方案 > 泛型 - 如何定义仅采用实现特定接口的类的方法

问题描述

我有一个目前看起来像这样的方法:

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)

我在这里做错了什么?

标签: javagenerics

解决方案


我不知道你为什么认为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。当您重命名它时,更清楚的是您传递一个实例只是几乎立即忽略了该实例的所有内容。


推荐阅读