Java:声明具有两个相关泛型类型的映射(<;T>;Map<;Class<;?扩展ClassA<;T>;;类<;?扩展ClassB<;T>;)
是否可以声明一个映射,从特定子类的键映射到特定子类的值,但确保两个类共享相同的类型参数 背景: ClassA和ClassB都实现了公共资源的行为Java:声明具有两个相关泛型类型的映射(<;T>;Map<;Class<;?扩展ClassA<;T>;;类<;?扩展ClassB<;T>;),java,generics,Java,Generics,是否可以声明一个映射,从特定子类的键映射到特定子类的值,但确保两个类共享相同的类型参数 背景: ClassA和ClassB都实现了公共资源的行为 public abstract class ClassA<T> { public abstract T getResource() ; } public abstract class classB<T> { public abstract void consoumeResource(T resou
public abstract class ClassA<T> {
public abstract T getResource() ;
}
public abstract class classB<T> {
public abstract void consoumeResource(T resource);
}
公共抽象类ClassA{
公共摘要T getResource();
}
公共抽象类B{
公共资源(T资源);
}
我想从ClassA和ClassB的实现映射,并确保只有“兼容”对可以放在一个条目中。在映射声明中不能这样做,但可以使用访问/更新映射的方法来实现 e、 g
private final Map builderMap=new LinkedHashMap();
公共void addBuilder(类tClass,Builder-tBuilder){
builderMap.put(tClass,tBuilder);
}
公共生成器getbuilder(类tClass){
@抑制警告(“未选中”)
Builder tBuilder=(Builder)builderMap.get(tClass);
返回tBuilder;
}
另一种方法是提供自己的Map
实现。如果扩展现有实现并使用新类型,则不需要太多代码:
public class CompatibleHashMap<T> extends HashMap<ClassA<T>, ClassB<T>> {
}
然后可以像下面这样实例化它
CompatibleMap<String> map = new CompatibleMap<>(new HashMap<ClassA<String>, ClassB<String>>());
CompatibleMap-map=newcompatiblemap(newhashmap());
这样,您就不会绑定到特定的
Map
实现,如果Map
、ClassA
和ClassB
的泛型类型不相同,编译器就会抛出错误。这不是我想要的,当我将自己与Map的具体实现联系在一起时——但这是我能看到的最好的解决方案。谢谢
public class CompatibleMap<T> implements Map<ClassA<T>, ClassB<T>> {
private Map<ClassA<T>, ClassB<T>> map;
public CompatibleMap(Map<ClassA<T>, ClassB<T>> map) {
this.map = map;
}
@Override
public Set<List<T>> keySet() {
return map.keySet();
}
// ... implement all other Map methods by calling the method on map.
}
CompatibleMap<String> map = new CompatibleMap<>(new HashMap<ClassA<String>, ClassB<String>>());