首页 > 解决方案 > 在覆盖期间使用通用 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:我不想让我的类通用,我只需要更改我的方法签名以使其在实现过程中具体化。

谢谢

标签: javaoopgenerics

解决方案


不,这是无效的。如果有 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();
    }
}

推荐阅读