Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我试图将一个方法转发给super,但它偶尔无法';不行。为什么?_Java - Fatal编程技术网

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
的旧值(如果有)。