gpt4 book ai didi

java - 如何创建将返回扩展一个父类(super class)的任何类的列表的方法

转载 作者:行者123 更新时间:2023-11-30 02:53:45 24 4
gpt4 key购买 nike

我正在 Spring 中开发一个小型网络应用程序。

我想避免重复代码,因此我想在服务层创建一种方法,该方法将根据参数调用适当的 DAO 方法。

对于一个抽象支付类别,我有三个子类(能源、水、天然气)。我还有一个名为 Media 的枚举类。

在服务中我想创建这样的东西:(基于How to have Java method return generic list of any type?)

@Autowired
ReadingDao<ReadingEnergy, InvoiceEnergy> energy;
@Autowired
ReadingWaterDAO water;
@Autowired
ReadingDao<ReadingGas, InvoiceGas> gas;

@Override
public <T extends ReadingAbstract> List<T> getReadingsForTenant(Apartment apartment, Media media) {
ReadingAbstract gg = new ReadingEnergy();

switch (media) {
case ENERGY:
return energy.getListForTenant(apartment);
break;
case GAS:

return gas.getListForTenant(apartment);
break;
case WATER:

return water.getListForTenant(apartment);
break;
default:
throw new IllegalArgumentException();
}
return 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();
}

}

这通常有效,但是当我创建一个新对象时

Apartment ap = (some apartment);
List<ReadingWater> list = (List<ReadingWater>) readingService.getReadingsForTenant(ap, Media.WATER);

我得到:

Type safety: Unchecked cast from List<capture#3-of ?> to List<ReadingWater>

我可以使用@SuppressWarnings("unchecked")但这对我来说看起来不太好。

处理此类问题的正确方法是什么?

最佳答案

您不能拥有依赖于运行时参数的返回类型:类型必须在编译时已知。

此方法唯一可以与所有返回语句匹配的返回类型是:List<? extends ReadingAbstract> 。它可能也许List<ReadingAbstract> ,但前提是您的 DAO 返回该类型。

如果你想知道列表的具体元素类型,你需要为每种媒体类型提供一个单独的方法:

public List<ReadingWater> getWaterReadingsForTenant(Apartment apartment);
public List<ReadingGas> getGasReadingsForTenant(Apartment apartment);
// etc.

这适用于您的示例用例,因为您静态指定 Media.WATER :只需静态调用 getWaterReadingsForTenant相反。

<小时/>

I could use @SuppressWarnings("unchecked") but that doesn't look to good for me.

编译器警告的出现是有原因的。您同样可以这样写:

List<ReadingWater> list =
(List<ReadingWater>) readingService.getReadingsForTenant(ap, Media.GAS);

这会导致运行时失败 - 只是不在这一行。那么你会花很多时间去追踪为什么你会得到 ClassCastException s 在遥远的代码中。

关于java - 如何创建将返回扩展一个父类(super class)的任何类的列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com