我在java中实现了一个实现Map的自定义类。根据map api,我需要为put(k,v)和putAll(map)方法抛出IllegalArgumentException。
我相信如果我有类似的话,我会抛出此异常:
MyMapClass<Integer, Integer> map = new MyMapClass<Integer, Integer>;
然后我打电话
map.put ("hello",5).
我是否正确,这是应该导致异常的情况?
如果是这样,我可以就如何测试这个问题找到方向吗?我不知道如何找出put方法中k和v的对象类型。
答案 0 :(得分:3)
尝试使用编译器期望Integer的String时,这将是一个编译时错误。没有一般情况你需要抛出IllegalArgumentException,它只是一个选项,如果你有一些特殊的规则没有强制执行,接口允许你做地图。
如果您对内容没有特殊限制,则没有理由抛出异常。您会注意到java.util.HashMap
实际上没有抛出它!
示例,如果您的类只接受正整数作为键:
public class MyMapKeyedOnPositiveInts<V> implements Map<Integer, V> {
public V put (Integer key, V value) {
if (key < 0) throw new IllegalArgumentException();
//do put
}
}
答案 1 :(得分:2)
根据Java API for Map接口Java 5(当前)你通过IllegalArgumentException;
如果此键或值的某些方面阻止它存储在此地图中
您提供的示例不是Map API所需的示例,这是因为Generics。在Java 5+中,Java将确保它是您在上面指定的编译时错误,因此您可以放心,您不需要在put
和putAll
中检查正确的类型方法
那么Map
JavaDoc上面的语句对你来说意味着什么呢?那么它真的取决于你在Map
接口的实现中做了什么。 Java中的许多Map
实现都不会抛出异常(HashMap
,TreeMap
,ConcurrentHashMap
等。