java - Java:一般返回由参数指定的类型化集合
问题描述
我想要一个方法来创建一个指定接口的列表。我似乎无法得到它,因此我不必强制转换或失去我的类型安全性。
此版本需要转换 Set 并产生不安全的类型转换警告:
public static Set<? extends Setting> getSettings(Class<? extends Setting> className){
Set<? extends Setting> result = new HashSet<>();
try {
Setting settingsObject = className.getDeclaredConstructor().newInstance();
// do something with it and populate result-set
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
Set<LiabilitySetting> liabilitySettings = (Set<LiabilitySetting>) getSettings(LiabilitySetting.class);
for (LiabilitySetting s: liabilitySettings) {
s.doSomething();
}
}
而在这个版本中,我需要在使用之前转换集合的元素
public static Set<Setting> getSettings(Class<? extends Setting> className){
Set<Setting> result = new HashSet<>();
try {
Setting settingsObject = className.getDeclaredConstructor().newInstance();
// do something with it and populate result-set
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
Set<Setting> liabilitySettings = getSettings(LiabilitySetting.class);
for (Setting s: liabilitySettings) {
((LiabilitySetting) s).doSomething();;
}
}
我觉得有一种方法可以编写我的方法而不会丢失类型安全且不必强制转换。有任何想法吗?
解决方案
请改用有界类型参数。
public static <T extends Setting> Set<T> getSettings(Class<T> className) {
通配符?
告诉编译器它是(或它自己)的某个子类,但编译器不知道in是否与.Setting
Setting
?
Class
?
Set
当您将它绑定到类型参数时,编译器仍然知道它T
是Setting
or的子类Setting
,但现在它知道 theSet
和 theClass
具有相同的类型,从而无需进行强制转换。
推荐阅读
- android - 在外部单击后,Android 警报对话框仍附加到上下文
- azure - 尝试在 Azure 中部署 Echobot 时,如何解决拒绝访问错误?
- sql - SQL - 如何在结果集中为列表中的所有值返回一个 COUNT 值
- excel - 抑制另存为 pdf 对话框
- selenium - 无法在 perl 中获取 Selenium::Remote::Driver 中的当前 URL
- asp.net-core - Blazor Webassembly 已验证事件
- python - Python:如何让用户输入在 csv 文件中添加一列?
- javascript - 单击按钮将特定图像加载到 HTML 文件上传
- php - Mongodo - 排序仅适用于数据子集
- reactjs - 如何将视频添加到 React 响应式轮播 Npm 包?