类对象的通用类型规范

4
我正在使用HashMap和下面的方法来跟踪类类型的更改监听器。IDE发出了警告。
[rawtypes] found raw type: java.lang.Class
  missing type parameters for generic class java.lang.Class<T>. 

需要指定哪种类型的Class才能解决警告?
private HashMap<Class, Set<ChangeListener>> classChangeListeners;

/**
 * Adds a ChangeListener to the listener list for the specified class type. The class type
 * specified must be a subclass of {@link BusinessObject}.
 *
 * @param  <T>  the type of BusinessObject.
 * @param  cls  the class type.
 * @param  listener  the ChangeListener to be added.
 */
public <T extends BusinessObject> void addChangeListener(Class<T> cls, ChangeListener listener)
{
 if (!classChangeListeners.containsKey(cls))
 {
  classChangeListeners.put(cls, new TreeSet<ChangeListener>());
 }

 classChangeListeners.get(cls).add(listener);
}
1个回答

5
如果您不关心特定的 Class 类型,可以使用 Class<?> 代替 原始类型 Class
在某些情况下,您可能需要通配符,Class<? extends BusinessObject> 或参数化它,Class<T> - 但通常 Class<?> 就足够了,并且很难从一个简短的片段中推断出您实际想要的内容。
另外,看起来您正在使用包含集合的 Map。您可以尝试使用 Multimap,它内置了这个功能,并且让工作变得更加轻松。

从你的代码看,显然Class<? extends BusinessObject>是最合适的。 - Carl Manaster
只要方法文档中记录的不变量确实适用于地图本身(在没有明确记录的情况下),我会同意... - Steven Schlansker
我想这取决于ChangeListener能处理什么。如果它只能处理BusinessObjects,那么我会选择Carl的建议。如果没有关系,我会写Class <?>。(一般来说,在数据结构中,我更喜欢<Object>而不是<?>,因为它清楚地表明我们正在类型层次结构内工作,但Class<Object>意味着我们不想要特定的东西。) - Justin K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接