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

时间:2012-02-28 12:55:55

标签: 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)
    ...

为了避免在方法的重载版本中重复描述,我想使用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)

其中发出以下警告:

@link:illegal character: "60" in "#parseBtCategories(Map<String, String>, 
                                                     String, String) Text"

ASCII 60是<,它是方法签名的一部分。它适用于Map, String, String)这种符号无法区分两种不同类型的地图。

This seems to be a known bug.有一个好的解决方法吗?

3 个答案:

答案 0 :(得分:22)

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

Java使用 Generics 实现Type Erasureconcept of Type Erasuregeneric types仅在编译时可用,此时它们被“擦除”;意味着它们被从类的字节码中删除。因此,在运行时无法访问不属于方法签名

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

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

答案 1 :(得分:19)

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

{@link class#method(signature) text-to-display}

请记得逃避<>。例如:

 {@link #parse(Map, String, String) parse(Map&lt;String, String&gt;, String, String)}

答案 2 :(得分:1)

它可能不是你想要的东西,但我已经学会了类似的东西 * @return {@link List} {@link RfRequestSummaryDto}