Java 如何创建将返回扩展一个超类的任何类的列表的方法
我正在春季开发一个小型web应用程序 我希望避免重复代码,因此我希望在服务层中创建一个方法,该方法将根据参数调用适当的DAO方法 对于一个抽象支付类,我有三个子类(能量、水、气体)。 我还有一个名为Java 如何创建将返回扩展一个超类的任何类的列表的方法,java,generics,Java,Generics,我正在春季开发一个小型web应用程序 我希望避免重复代码,因此我希望在服务层中创建一个方法,该方法将根据参数调用适当的DAO方法 对于一个抽象支付类,我有三个子类(能量、水、气体)。 我还有一个名为Media的枚举类 在服务中,我想创建如下内容: (基于) @Autowired 读道能源; @自动连线 读水道水; @自动连线 读道气; @凌驾 公共列表GetReadingFortenant(公寓、媒体){ ReadingAbstract gg=新的ReadingEnergy(); 交换机(媒体)
Media
的枚举类
在服务中,我想创建如下内容:
(基于)
@Autowired
读道能源;
@自动连线
读水道水;
@自动连线
读道气;
@凌驾
公共列表GetReadingFortenant(公寓、媒体){
ReadingAbstract gg=新的ReadingEnergy();
交换机(媒体){
案例能量:
返回能量。GetListFortendent(公寓);
打破
外壳气体:
返回气体。GetListFortendent(公寓);
打破
案例水:
回水。GetListFortendent(公寓);
打破
违约:
抛出新的IllegalArgumentException();
}
返回null;
}
不幸的是我
Type mismatch: cannot convert from List<ReadingEnergy> to List<T>
类型不匹配:无法从列表转换为列表
我也试过这样做:
public List<?> getReadingsForTenant(Apartment apartment, Media media) {
switch (media) {
case ENERGY:
System.out.println("getReadingsForTenant - energia");
return energy.getListForTenant(apartment);
case GAS:
System.out.println("getReadingsForTenant - gas");
return gas.getListForTenant(apartment);
case WATER:
System.out.println("getReadingsForTenant - woda");
return water.getListForTenant(apartment);
default:
throw new IllegalArgumentException();
}
}
公共列表GetReadingFortenant(公寓、媒体){
交换机(媒体){
案例能量:
System.out.println(“GetReadingFortenant-energia”);
返回能量。GetListFortendent(公寓);
外壳气体:
System.out.println(“GetReadingFortenant-gas”);
返回气体。GetListFortendent(公寓);
案例水:
System.out.println(“GetReadingFortenant-woda”);
回水。GetListFortendent(公寓);
违约:
抛出新的IllegalArgumentException();
}
}
这通常有效,但当我创建一个新对象时
Apartment ap = (some apartment);
List<ReadingWater> list = (List<ReadingWater>) readingService.getReadingsForTenant(ap, Media.WATER);
公寓ap=(一些公寓);
List=(List)readingService.getReadingsForTenant(ap,Media.WATER);
我得到:
Type safety: Unchecked cast from List<capture#3-of ?> to List<ReadingWater>
类型安全:未选中从列表到列表的强制转换
我可以使用@SuppressWarnings(“unchecked”)
,但这对我来说并不好
处理此类内容的正确方法是什么?不能有依赖于运行时参数的返回类型:类型必须在编译时已知
此方法的唯一返回类型是:
list注意:return
语句后的break
是不可访问的,因此不需要。
Type safety: Unchecked cast from List<capture#3-of ?> to List<ReadingWater>
public List<ReadingWater> getWaterReadingsForTenant(Apartment apartment);
public List<ReadingGas> getGasReadingsForTenant(Apartment apartment);
// etc.
List<ReadingWater> list =
(List<ReadingWater>) readingService.getReadingsForTenant(ap, Media.GAS);