泛型能力问题:Map<K, V> inside class / method without K and V in their signature

Generics competence problem: Map<K, V> inside class / method without K and V in their signature

请向我咨询我可能很愚蠢的问题。

我为我的问题准备了一些抽象的解释。 请不要尝试在您的计算机上重复它,这只是为了展示逻辑。

我的class如下(同样,这只是为了说明):

public class Operation<D1, D2, R> extends AbstractOperation<D1, D2> implements InterfaceOperation<D1, D2, R> {

    @Override
    public Collection<R> doOperation(Collection<D1> collection_1, Collection<D2> collection_2) {    

        Map<String, String> map_1 = createMap_1(collection_1);
        Map<String, String> map_2 = createMap_2(collection_2);

        return (Collection<R>) ... ;
    }
}

我有一个 class Operation 实现合约 InterfaceOperation.在 abstract class 里面只是一些常用的方法。因此,OperationInterfaceOperation 的签名doOperation(Collection collection_1, Collection collection_2) 无法更改。

D1D2是Collection里面的一种元素,进入到doOperation 方法。

所以,CollectionData 元素组成,我将把它们映射到 map_1map_2.

Data 可以有对象的任意组合,它是通用的并且运行良好,但是,Map map_1(和第二个)限制我只能在 Data 中使用 .

我需要这些地图(map_1map_2)是通用的,比如 Map map_1(与map_2相同),但不放置 进入方法或class 签名:

public class Operation<D1, D2, R> extends AbstractOperation<D1, D2> implements InterfaceOperation<D1, D2, R> {

    @Override
    public Collection<R> doOperation(Collection<D1> collection_1, Collection<D2> collection_2) {


        Map<K, V> map_1 = createMap_1(collection_1);
        Map<K, V> map_2 = createMap_2(collection_2);

        return (Collection<R>) ... ;
    }
}

怎么可能?如果这是泛型中的一个具体主题,请告诉我,我会阅读它。 或者不更改class/interface/method签名是不可能的?

谢谢!

更新#1: 方法createMap_1createMap_2abstractclassAbstractOperation 看起来像下面这样:

public abstract class AbstractOperation<D1, D2> {

    protected Map<Integer, String> createMap_1(Collection<D1> collection_1) {
        return collection_1.stream()
                .map(e -> (Data<Integer, String>) e)
                .collect(Collectors.toMap(Data::getKey, DataRow::getValue));
    }
    ...
}

如果您的 doOperation 方法不关心这些映射的键和值的类型,您可以使用 wildcards:

Map<?, ?> map_1 = createMap_1(collection_1);
Map<?, ?> map_2 = createMap_2(collection_2);

请注意,这限制了您可以在地图上安全执行的操作类型。例如,如果没有不安全的转换,您将无法将值放入地图或从地图中获取值,因为此方法不知道要使用的键的类型。