当前位置: 首页 > 知识库问答 >
问题:

如何检查方法的泛型返回类型是否与通过参数传递的类匹配?

袁博
2023-03-14

我有一个map,它存储了一个名为DAO的超类的实例。用户可以将这个DAO类的不同子类放入映射中。映射的键是相应模型的class(即apple.class),它们也作为实例变量存储在DAO对象中。随后可以通过getter检索DAO实例,该getter使用泛型并将DAO强制转换为所需的子类型。

Map<Class<? extends Model>, DAO> daoMap = new HashMap<>();


// Create and store DAOs
SearchDAO<Apple> appleDAO = new SearchDAO<>(Apple.class);
daoMap.put(Apple.class, appleDAO);
CrudDAO<Orange> orangeDAO = new CrudDAO<>(Orange.class);
daoMap.put(Orange.class, orangeDAO);


// Method to retrieve DAOs
@SuppressWarnings("unchecked")
public <T extends DAO> T getDAO(Class<? extends Model> modelClass) {
    return (T) daoMap.get(modelClass);
}

要检索DAO,您只需执行以下操作:

final SearchDAO<Apple> appleDAO = this.getDAO(Apple.class);

这工作得很好,但是现在我想要一个检查,当存储的DAO中的模型类不等于T时抛出一个异常。即。以下操作在执行时应引发异常:

final SearchDAO<Orange> orangeDAO = this.getDAO(Apple.class);

如前所述,class类型也存储在DAO本身中。所以我想这样检查一下:

@SuppressWarnings("unchecked")
public <T extends DAO> T getDAO(Class<? extends Model> modelClass) {
    T dao = (T) daoMap.get(modelClass);
    if(!dao.getModelClass() instancof T) {
       throw new IllegalStateException("Apples are not Oranges!");
    }
    return dao;
}

这有可能吗?谢谢你的建议!

共有1个答案

欧桐
2023-03-14

这工作很好,但现在我想要一个检查,当存储的DAO中的模型类不等于T时抛出一个异常。以下操作在执行时应引发异常:

T是扩展DAO的东西,因此model类永远不等于T,因为model类是扩展model的东西。

如果您希望确保存储在映射中模型类键(例如apple.class)下的DAO具有相同的ModelClass实例,您可以这样做:

 @SuppressWarnings("unchecked")
 public <T extends DAO> T getDAO(Class<? extends Model> modelClass) {
    T dao = (T) daoMap.get(modelClass);
    if(!dao.getModelClass().isAssignableFrom(modelClass)) {
         throw new IllegalStateException("Apples are not Oranges!");
    }
    return dao;
 }

如果您现在将具有模型类apple.classDAO实例放在映射中orange.class键下:

SearchDAO<Apple> appleDAO = new SearchDAO<>(Apple.class);
daoMap.put(Apple.class, appleDAO);
daoMap.put(Orange.class, appleDAO);

你叫橘子:

final SearchDAO<Orange> orangeDAO = getDAO(Orange.class);

你得到:

java.lang.IllegalStateException: Apples are not Oranges!

如果这是您想要的,您还可以考虑在将DAO实例放入映射中时执行检查,并在key类与DAO的modelClass不相同时抛出异常

 类似资料:
  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,

  • 问题总结:我想传递一个带有类型参数(如

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 可以使用泛型将返回类型与参数类型匹配吗? 实例案例: 我有一个抽象类,可以从不同的POJO导入数据,这个类包含一个abstract方法importData。 importData返回的对象必须与传递给该方法的对象类型相同。 由于抽象方法的每个实现的对象类型不同,并且类型不扩展另一个,如何定义抽象方法,以便实现返回类型和传递类型必须匹配? 经过考验: 结果: 方法的返回类型不必与传递的对象类型匹配。

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的