是的,这里有几个不同的问题。
IntSummaryStatistics.toString规范中复制了一些文本来自Object.toString,它覆盖了Object.toString。第一部分是正确的:
返回对象的字符串表示形式。通常,toString方法返回一个“文本上代表”此对象的字符串。结果应该是简明但信息丰富的表示,易于人们阅读。建议所有子类都重写此方法。
这代表了Object.toString定义的契约,并对所有子类施加要求。
从Object.toString复制的规范的第二部分是这样的:
对象的toString方法返回一个字符串,该字符串由对象是其实例的类的名称、at-sign字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,该方法返回一个等于以下值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
这是正确的,但与此无关,因为它谈论了在
IntSummaryStatistics.toString
规范中实现
Object.toString
。将其复制到这里是不合适的。请注意,这是关于
Object.toString
的
实现而不是覆盖所需实现的
契约。
问题在于javadoc
{@inheritDoc}
指令在
IntSummaryStatistics.toString
的文档注释中使用时会复制整个内容,而实际上只需要复制部分内容。具体来说,应该复制施加于子类的契约,但不应复制实现规范。
在JDK 8之前,没有办法将它们分开,因此要么手动复制(导致不一致),要么使用
{@inheritDoc}
,它会复制不需要的内容。在JDK 8中,引入了一些新的javadoc标签,例如
@implSpec
(实现规范),将文档注释分成不同的部分。
{@inheritDoc}
指令可以有选择地继承这些部分,而不是继承整个文档。不幸的是,在这种情况下没有使用这些标签,因此我们需要进行一些清理。
这些新标签在此信息性JEP中有记录。请注意,这些标签是特定于JDK的,不能(尚未)用于JDK之外的javadoc。
还有一部分缺失。 Object.toString
文档注释在概念上分为定义子类契约的部分和定义其实现的部分。理想情况下,我们希望将契约部分复制到 IntSummaryStatistics.toString
的文档中,并且还有另一部分定义 IntSummaryStatistics.toString
的实现。事实证明确实有这样的部分,但它并不可见!IntSummaryStatistics.toString
的源代码具有以下文档注释:
@Override
public String toString() { ...
很不幸,“返回非空字符串表示…”这个文本在javadoc输出中没有出现。这对我来说似乎是另一个错误。编辑:错误在于注释位于@Override注释和方法声明的其余部分之间。文档注释必须出现在整个方法声明之前,包括注解。因此,该注释看起来像是文档注释,但由于位置错误,被javadoc忽略了。
我已经提交
JDK-8080449和
JDK-8080450来解决这些问题。
summarizingInt
。 - Alexis C.