2012-02-28 148 views
25

考慮在一個類的一個靜態方法,我已經採用javadoc記錄它:的Javadoc錯誤:@link不能處理泛型「<>」

/** 
* 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.有沒有很好的解決方法?

+0

只是爲了請確保:您真的在'parse'之前使用'{@ link# 2012-03-03 17:11:06

回答

21

參數化類型不是方法簽名的一部分。

Java實現GenericsType Erasureconcept of Type Erasuregeneric types僅在編譯時纔可用,在此時它們被「擦除」;這意味着它們從類的字節碼中剝離出來。因此它們是在運行時不可訪問不是方法的簽名的一部分。

那麼,有沒有真正的理由來讓他們成爲的Javadoc鏈接簽名的一部分,因爲你不能超載兩種方法與泛型類型解析到相同的原始類型:不能有對泛型類型中的歧義您的來源簽名。

此外,Javadoc支持HTML標籤,我認爲這可能是另一個爲什麼它在這裏咬了灰塵的原因,但我真的懷疑Javadoc處理工具是這個不好實現。

+29

我不認爲這個論點持有水。僅僅因爲編譯器實現了帶有類型擦除的泛型並不排除文檔包含泛型類型參數。泛型和文檔是針對人的,但字節碼是針對JVM的。類型刪除在JVM的側面更加強烈,因此它在這裏沒有密切關係。 – 2012-03-02 23:34:39

+0

@AdamMihalcin:我同意它對文檔很重要。該文檔可以包含通用類型來描述簽名。但是我不明白爲什麼它需要將它們用於鏈接。這不是一回事。 – haylem 2012-03-02 23:35:46

+0

@AdamMihalcin:謝謝你接受答案。我忘了給你一個[this]的鏈接(http://hg.openjdk.java.net/jdk6/jdk6-gate/jdk/file/tip/src/share/classes/java/util/Collections.java) ,所以你可以看到自己。正如您所看到的,即使JDK庫不在'@ link'標籤中使用任何參數化類型信息。 – haylem 2012-03-07 10:03:58

11

大衛·康拉德解決方案類似,您可以使用完整的簽名爲紐帶的描述,使用語法:

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

記住逃脫<>。例如:

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

這個文件應該如何返回類型? – Lawrence 2015-10-19 14:45:52

+0

我認爲這是最好的答案。 – xdhmoore 2015-12-28 19:20:31

0

它可能不是你要找的東西,但我已經學會了忍受{RfRequestSummaryDto @link}的類似 * @返回{@link名單}