泛型能力问题: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 里面只是一些常用的方法。因此,Operation 、InterfaceOperation 和 的签名doOperation(Collection collection_1, Collection collection_2) 无法更改。
D1和D2是Collection里面的一种元素,进入到doOperation 方法。
所以,Collection 由 Data 元素组成,我将把它们映射到 map_1 和 map_2.
Data 可以有对象的任意组合,它是通用的并且运行良好,但是,Map map_1 (和第二个)限制我只能在 Data 中使用 .
我需要这些地图(map_1 和 map_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_1和createMap_2在abstractclassAbstractOperation 看起来像下面这样:
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);
请注意,这限制了您可以在地图上安全执行的操作类型。例如,如果没有不安全的转换,您将无法将值放入地图或从地图中获取值,因为此方法不知道要使用的键的类型。
请向我咨询我可能很愚蠢的问题。
我为我的问题准备了一些抽象的解释。 请不要尝试在您的计算机上重复它,这只是为了展示逻辑。
我的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
D1和D2是Collection里面的一种元素,进入到doOperation 方法。
所以,Collection 由 Data
Data
我需要这些地图(map_1 和 map_2)是通用的,比如 Map
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_1和createMap_2在abstractclassAbstractOperation
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);
请注意,这限制了您可以在地图上安全执行的操作类型。例如,如果没有不安全的转换,您将无法将值放入地图或从地图中获取值,因为此方法不知道要使用的键的类型。