【发布时间】:2021-10-24 02:55:01
【问题描述】:
请向我咨询我可能很愚蠢的问题。
我为我的问题准备了一点抽象的解释。 请不要尝试在您的计算机上重复它,这只是为了展示逻辑。
我的班级如下(同样,这只是为了说明):
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>) ... ;
}
}
我有一个 类 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>) ... ;
}
}
这怎么可能?如果这是泛型中的一个具体主题,请告诉我,我会阅读它。 或者不改变类/接口/方法签名是不可能的?
谢谢!
更新 #1:
createMap_1 和 createMap_2 方法位于 abstract class AbstractOperation
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));
}
...
}
【问题讨论】:
-
那么,
createMap_1和createMap_2方法的签名是什么? -
亲爱的 Ale,我已经用整个方法体更新了我的问题。谢谢。
-
看起来这些应该在
Operation的子类中,将特定类型分配给D1、D2和R,例如class StringOperation extends Operation<String, String, String> { ... }. -
亲爱的 Louis,D1、D2 和 R 是 Collection 类型。我从这些集合中提取对象 Data
并将它们放入 Map,但 map 不是通用的,但必须是通用的。或者我必须取出地图并仅使用集合进行操作...我应该有可能将任何类型的对象放入 Data 中,但由于 Map 它们只能是类型,我在 Maps 中编写。 -
泛型的重点是你永远不需要转换任何东西。使实际类型显式化的具体子类是预期的解决方案。如果
K和V只能是Integer和String,因为那是createMap_1的实际实现,那么泛型应该反映这一点。
标签: java generics collections