Java 泛型-定义映射<;MyClassA<>;,MyClassB<&燃气轮机&燃气轮机;确保两者?都一样吗?

Java 泛型-定义映射<;MyClassA<>;,MyClassB<&燃气轮机&燃气轮机;确保两者?都一样吗?,java,generics,Java,Generics,我有一行代码: private final Map<MyClassA<?>, MyClassB<?>> myMap = new HashMap<>(); private final Map>myMap=new HashMap(); 有没有办法定义映射,让编译器知道?在每种情况下都必须是同一类 像这样的 private final <T> Map<MyClassA<T>, MyClassB<T>>

我有一行代码:

private final Map<MyClassA<?>, MyClassB<?>> myMap = new HashMap<>();
private final Map>myMap=new HashMap();
有没有办法定义映射,让编译器知道?在每种情况下都必须是同一类

像这样的

private final <T> Map<MyClassA<T>, MyClassB<T>> myMap = new HashMap<>();
private final Map myMap=new HashMap();
。。。哪个不是合法语法

这只是一个自我学习的问题

FWIW,我想添加一个方法

public <T> MyClassB<T> getForA(MyClassA<T> a) {
    return this.myMap.get(a);
}
公共MyClassB getForA(MyClassA){
返回此.myMap.get(a);
}

但是我会得到一个编译错误,除非我可以定义
myMap
来坚持键和值都包装为相同的类型。

如果为所需的类型引入一个静态内部类,则可以执行类似的操作。例如:

public class DoubleGenericTest<T> {

   public static class MapHolder<Z> {
      private final Map<MyClassA<Z>, MyClassB<Z>> myMap = new HashMap<>();
   }

   private final MapHolder<String> stringMap = new MapHolder<>();
   private final MapHolder<Integer> integerMap = new MapHolder<>();


}

class MyClassA<X> {}
class MyClassB<Y> {}
公共类DoubleGenericTest{
公共静态类映射持有者{
私有最终映射myMap=newhashmap();
}
私有最终映射持有者stringMap=新映射持有者();
private final MapHolder integerMap=new MapHolder();
}
类MyClassA{}
类MyClassB{}

这将为您提供需要挂起类型参数的类。可能在任何情况下都不理想,但这是我唯一能想到的。

正如您已经了解到的,如果不同条目的键和值不同,则无法做到这一点:

map.put(new MyClassA<Foo>(), new MyClassB<Foo>());
map.put(new MyClassA<Bar>(), new MyClassB<Bar>());
map.put(新建MyClassA(),新建MyClassB());
put(new MyClassA(),new MyClassB());
(我已从中获取此要求)

您可以编写一些帮助器方法来强制执行此约束:

public <T> void put(MyClassA<T> key, MyClass<B> value) {
    // Maybe check at runtime if the constraint is not validated?
    map.put(key, value);
}

public <T> MyClassB<T> get(MyClassA<T> key) {
    // This will produce an unchecked warning.
    return (T) map.get(key);
}
public void put(MyClassA键,MyClass值){
//如果约束未验证,可能会在运行时检查?
map.put(键、值);
}
公共MyClassB get(MyClassA密钥){
//这将产生未经检查的警告。
return(T)map.get(key);
}
只要您仅通过此类帮助器方法访问映射(并且不使用原始类型),映射上的约束就不会被违反,这允许您编写类型安全代码


唯一不安全的部分是那些helper方法,这是您必须小心的地方。

您需要在类级别定义泛型类型。您始终可以添加具体类型。否则,您需要提供泛型参数。我无法在类级别定义泛型类型。每个映射条目可以有不同的T。只是对于每个条目,键和值包装为同一类型。@Matthewmpeak这不是用语法可以表达的东西。这也不是
Map
s的工作原理。在一个映射上对
get(…)
的所有调用都应返回相同的类型。这听起来很像是一场灾难。你能告诉我们为什么你需要强制执行这个约束吗?@turing85是的,当事情很难做时,这通常是一个很好的迹象,表明你不应该这样做。我自己也能想出一个替代的解决方案——我只是想确保我没有错过这样做的方法(例如,我不知道的一些很酷的语法)。同样,地图中的每个条目都包装相同的类型“Z”。每个条目的键和值必须映射到相同的类型。这对我也不起作用。你是说它们是一样的,但你不知道那是什么类型的?你能举个更具体的例子吗?我还怀疑这里存在某种XY问题。在某些地方,有
映射并不罕见