我收到几个关于我在一个类中使用泛型的编译器警告,并且可以使用一些帮助。我有以下设置:
Map<EventType, List<? extends Listener>> map;
我有几种不同的事件类型,对于每一种,我想保留相应的侦听器类型列表。 Listener是一个接口,有几个接口可以扩展它。
稍后我会在此地图中添加一个List,如:
List<StateListener> list = new LinkedList<StateListener>();
list.add(someStateListener);
map.put(Events.STATE, list);
然后我会收到警告......
List<StateListener> list = map.get(Events.STATE);
用于未经检查的转化。
我通读了其他一些帖子,但我没有看到任何有用的内容。感谢任何评论
答案 0 :(得分:2)
您必须使用StateListener类作为地图的键。
答案 1 :(得分:1)
由于您宣布地图的值类型为List
map.get(Events.STATE)
的{{1}}为List<StateListener>
你需要施放它,或相应地声明;
List<? extends Listener>
答案 2 :(得分:1)
无法保证List
返回的map.get()
为List<StateListener>
。编译器只能保证map.get()
返回的任何内容都是List<? extends Listener>
。
因此,要么将Map
声明为List<Listener>
的映射,并处理不知道哪个特定Listener
实现从地图中出来的对象的限制: / p>
Map<EventType, List<Listener>> map;
List<Listener> list = new LinkedList<Listener>();
list.add(someStateListener);
map.put(Events.STATE, list);
// later...
List<Listener> other = map.get(Events.STATE);
或在声明中更具体,并与 限制:
一起生活Map<EventType, List<StateListener>> map;
List<StateListener> list = new LinkedList<StateListener>();
list.add(someStateListener);
map.put(Events.STATE, list);
// later...
List<StateListener> other = map.get(Events.STATE);