Java 我试图将一个方法转发给super,但它偶尔无法';不行。为什么?
这是有问题的代码,在本例中进行了简化:Java 我试图将一个方法转发给super,但它偶尔无法';不行。为什么?,java,Java,这是有问题的代码,在本例中进行了简化: /** A version of Hashtable that lets you do * table.put("dog", "canine");, and then have * table.get("dogs") return "canine". **/ public class HashtableWithPlurals extends Hashtable { /** Make the table map both key and key +
/** A version of Hashtable that lets you do
* table.put("dog", "canine");, and then have
* table.get("dogs") return "canine". **/
public class HashtableWithPlurals extends Hashtable {
/** Make the table map both key and key + "s" to value. **/
public Object put(Object key, Object value) {
super.put(key + "s", value);
return super.put(key, value);
}
}
您是否应该返回
super.get(键)代码>
编辑
现在我仔细看了看,你的put
方法应该是void
?为什么它首先返回一个对象
?天哪,你覆盖了一个哈希表。是的,文档在这种情况下不是特别有用
我仅举一个例子,因为他比我说得更好:
public class HashtableWithPlurals extends Hashtable {
/** Make the table map both key and key + "s" to value. **/
public Object put(Object key, Object value) {
super.put(key + "s", value);
return super.put(key, value);
}
}
当你要去上学时,你需要小心
超级,你完全明白什么
超级方法确实如此。在这种情况下,,
Hashtable.put的合同是
它将记录
键和表中的值。
但是,如果哈希表
已满,则Hashtable.put将分配
表的较大数组,全部复制
把旧的东西翻过来,然后
递归地重新调用table.put(键,
价值)。现在,因为Java解析
方法的运行时类型
目标,在我们的示例中
代码中的递归调用
哈希表将转到
HashtableWithPlurals.put(键,值),
最终的结果是
偶尔(当
桌子刚好在错误的位置溢出
时间),您将获得
“狗”以及“狗”和
“狗”。现在,它在世界上的任何地方都有说明吗
该文档用于执行该操作
这种递归调用是可能的吗?
不,在这种情况下,它肯定会有帮助
对JDK进行源代码访问
解决方案是什么?不要扩展HashTable,而是使用一个包装类,它在内部存储一个HashTable,并将必要的方法转发给它(这不是一个100%完美的解决方案,但在大多数情况下它已经足够好了,并且没有这些问题)。或者非常仔细地查看源代码,确保您完全理解发生了什么。。并编写大量测试(和一些模糊测试)
PS:这几乎是我最喜欢的一个例子,当我和那些认为OOP让一切变得更简单、更简单的人争论时,仍然没有什么灵丹妙药;)
PPS:考虑到这两个例子几乎是一样的-能告诉我们你从哪里得到的吗?只是好奇,因为这里似乎有人把诺维格邮报作为灵感;) “它有时不起作用”不是很好的描述。错误消息是什么?您的代码看起来很好。您的问题是什么?Map.put(key,val)
返回映射到key
的旧值(如果有)。