Javadoc bug:@link无法处理泛型"<>"

Ada*_*tan 34 generics javadoc

考虑一个类中的静态方法,我已经使用javadoc记录了它:

/**
 * Description here.
 *
 * @param names       - The parameters of the impression request.
 * @param ids         - An intent object to enrich.
 * @param prefix - A prefix.
 */

public static void parse(Map<String, String> names, String ids, String prefix)
    ...
Run Code Online (Sandbox Code Playgroud)

为了避免重复方法的重载版本中的描述,我想使用javadoc @link:

 /**
 * Overloaded version with default prefix.
 * {@link #<parse(Map<String, String>, String, String)> [Text]}
 */

public static void parse(Map<String, String> names, String ids, String prefix)
Run Code Online (Sandbox Code Playgroud)

这给出了以下警告:

@link:illegal character: "60" in "#parseBtCategories(Map<String, String>, 
                                                     String, String) Text"
Run Code Online (Sandbox Code Playgroud)

ASCII 60是<方法签名的一部分.它与Map, String, String)坚果一起使用这种符号无法区分两种不同类型的地图.

这似乎是一个已知的错误.有一个很好的解决方法吗?

hay*_*lem 22

参数化类型不是方法签名的一部分.

Java 使用Type Erasure实现Generics.Type Erasure概念泛型类型仅在编译时可用,此时它们被"擦除"; 意味着它们被从类的字节码中删除.因此,它们无法在运行时访问没有方法签名的一部分.

因此,没有真正的理由让它们成为Javadoc链接签名的一部分,因为您不能使用解析为相同原始类型的泛型类型重载两个方法:源签名中的泛型类型不会存在歧义.

另外,Javadoc支持HTML标记,我认为这可能是它在这里沾沾自喜的另一个原因,但我真的怀疑Javadoc处理工具是如此糟糕的实现.

  • 我不认为这种说法有用.仅仅因为编译器使用类型擦除实现泛型并不排除文档包含泛型类型参数.泛型和文档适用于人,但字节码适用于JVM.类型擦除在JVM方面下降得更厉害,因此它与此并不密切相关. (40认同)
  • 在我遇到的情况下,它描述了参数的类型,链接看起来像`{@link List <Customer>}`.如果删除它,javadoc最终只是将参数描述为List.这对调用者来说没有任何信息.为什么要把它作为链接呢?所以他们可以点击它.在这种情况下,一个好的解决方案是`{@link List}&lt; {@ link Customer}&gt;`,这样他们就可以点击List或者客户的链接,具体取决于他们想要看到的内容. (30认同)
  • java doc 的目的是提供有关设计过程中预期内容的数据。因此,我也强烈认为 Javadoc 应该允许泛型为开发人员提供所有信息,以了解期望返回什么或提供什么作为参数。 (3认同)
  • 前两段需要额外的资格.参数化类型*是编译时方法签名的一部分.在编译期间,键入具有参数化类型的擦除映射签名到具有原始类型的签名.参见例如JLS 4.6:Type Erasure. (3认同)

nuo*_*eri 22

David Conrad解决方案类似,您可以使用完整签名作为链接描述,使用语法:

{@link class#method(signature) text-to-display}
Run Code Online (Sandbox Code Playgroud)

记住逃生<>.例如:

 {@link #parse(Map, String, String) parse(Map&lt;String, String&gt;, String, String)}
Run Code Online (Sandbox Code Playgroud)