2012-08-09 51 views
0

我想用這簡直是實現了一個頂級域名的功能,MyAccessManager是一個抽象類,有2名兒童不同重載函數:在TLD功能使用類型參數

public static <T extends MyAccessManager> boolean isAllowed(T accessMan, MyTypeEnum otherUsersEnum){ 
    // trivial implementation 
} 

我上面的方法也定義在我的TLD定義文件(* .tld)。

我有2類延伸我MyAccessManager,我通過EL使用功能,如:

<input name="foo" type="hidden" value="${mytaglib:isAllowed(param1, param2)}"/> 

我通過正確的參數(即兒童類的實例作爲參數1)我的TLD的功能,但web應用程序拋出異常如下:

org.apache.jasper.JasperException:PWC6300:無法找到TLD中函數mytaglib:isAllowed的方法簽名中指定的類T.牛逼

我的TLD文件:

<function> 
     <description>Processes users access to specific resources</description> 
     <name>isAllowed</name> 
     <function-class>com.myproj.MyUtil</function-class> 
     <function-signature>boolean isAllowed(T,com.myproj.MyTypeEnum)</function-signature> 
</function> 

是否TLD不支持Java的類型參數?或者,有什麼方法可以實現這樣的功能?

回答

1

我不明白你爲什麼需要T可言。

這是多態的典型案例,你不需要類型參數和其他普通的東西在這裏:

public static boolean isAllowed(MyAccessManager accessMan, MyTypeEnum otherUsersEnum){ ... } 

<function-signature>boolean isAllowed(MyAccessManager,com.myproj.MyTypeEnum)</function-signature> 
+0

這就產生錯誤也確實這種做法是我第一次嘗試。 java.lang.ClassCastException異常。它不能投我的子類其父古怪.. – px5x2 2012-08-09 10:17:51

+0

我的壞,我有2個獨立的AccessManager。我將它轉換爲正確的,但我仍然不知道,這種用法在上面我的帖子是否是可能的。 – px5x2 2012-08-09 10:22:35

+0

我想這是不可能的,因爲類型擦除,所以,你必須在TLD使用的簽名的擦除版本。但實際上它沒有什麼意義。 – axtavt 2012-08-09 10:24:19