我有一个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;
}
这有可能吗?谢谢你的建议!
这工作很好,但现在我想要一个检查,当存储的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.class
的DAO
实例放在映射中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对象。这导致我: 我的问题 如何获得通用(返回)类型的