java - 在覆盖期间使用通用 Map 参数将具体对象返回到通用方法
问题描述
我有一个带有通用 Map 参数的通用方法。我想覆盖它并使用具体的子类型,但是没有强制转换我无法返回我的子类型
public interface GarrageSimple {
<T extends Car> T getCar(Map<String, T> c);
}
下面的实现给出了错误:不兼容的类型。必需:T找到:Bmw
public class GarrageSimpleImpl implements GarrageSimple {
@Override
public <T extends Car> T getCar(Map<String, T> c) {
return new Bmw();
}
}
实际上,Bmw 是 Car 的子类,表示 T 的类型。当我将它转换为 * return (T)new Bmw();* 它会发出警告,即Unchecked 将 Bmw 转换为 T
我知道这是因为我冒险返回具体的子类,而方法签名是通用的,但是我如何更改我的方法以使其具体而不破坏覆盖签名?如果可以的话,在这种情况下,它应该可以按预期工作。
PS:我不想让我的类通用,我只需要更改我的方法签名以使其在实现过程中具体化。
谢谢
解决方案
不,这是无效的。如果有 GarrageSimpleImpl 引用的人用不同的类扩展 Car 调用它会发生什么?泛型都是关于编译时安全的,这就是你得到这个错误的原因。
但你可以这样做,
public interface GarrageSimple<T extends Car> {
T getCar(Map<String, T> c);
}
public class GarrageSimpleImpl implements GarrageSimple<Bmw> {
@Override
public Bmw getCar(Map<String, Bmw> c) {
return new Bmw();
}
}
推荐阅读
- node.js - 无法通过node js发送电子邮件,尝试了几种方法
- python - python - 如何在一个参数中为python中的散射函数设置颜色和标记
- c - 任何人都可以详细解释以下c中的指针程序吗?
- php - 将字符串格式存储在db中的数据转换为对象日期时间
- apache - 导入 .war 文件时出现 Apache 错误。“错误:失败 - 无法启动上下文路径 [/文件夹] 处的应用程序”
- java - 如何转换复杂对象列表并将其表示为值 yaml 图表
- javascript - 在Javascript中使用Symbol.iterable进行迭代时如何检测当前元素是最后一个元素?
- linux - 并行运行命令,如果任何命令使用 wait 失败,则运行失败
- javascript - 显示数组中第一个值的函数,如果再次运行,显示数组的第二个值
- python - 如何在 Django 中获取过滤键和结果元组