作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一行代码:
private final Map<MyClassA<?>, MyClassB<?>> myMap = new HashMap<>();
有没有什么方法可以以告诉编译器的方式定义该映射?在每种情况下都必须是同一类?
是这样的吗?
private final <T> Map<MyClassA<T>, MyClassB<T>> myMap = new HashMap<>();
...这不是合法的语法?
目前只是一道自学题。
FWIW,我想添加一个方法
public <T> MyClassB<T> getForA(MyClassA<T> a) {
return this.myMap.get(a);
}
但是除非我可以定义 myMap
来坚持键和值都包装相同的类型,否则我会遇到编译错误。
最佳答案
正如您已经知道的那样,如果不同条目的键和值不同,则无法执行此操作:
map.put(new MyClassA<Foo>(), new MyClassB<Foo>());
map.put(new MyClassA<Bar>(), new MyClassB<Bar>());
(我从 your comment 中获取了这个要求)
你可以做的是编写一些辅助方法来强制执行此约束:
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);
}
只要您仅通过此类辅助方法访问 map (并且不使用原始类型),就不会违反 map 上的约束,这使您可以编写类型安全的代码。
唯一不是类型安全的部分是那些辅助方法,这是您必须小心的地方。
关于java - 泛型 - 定义 Map<MyClassA<?>, MyClassB<?>> 确保两者 ?是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58225226/
我有一行代码: private final Map, MyClassB> myMap = new HashMap<>(); 有没有什么方法可以以告诉编译器的方式定义该映射?在每种情况下都必须是同一类?
我是一名优秀的程序员,十分优秀!