2013-03-09 71 views
4

我有一個通用的方法,實例化一個對象如下:我歧義與通用方法

@Override 
public <T> T createRawObject(Class<?> raw_type, 
          ProviderParam param) 
{ 
    SpringProviderParam spring_param = (SpringProviderParam) param; 
    ApplicationContext ctx = SpringContextGenericProvider.getInstance() 
                 .generate(param, 
                    ApplicationContext.class, 
                    (Object[]) spring_param.getContextPaths()); 
    ValidateUtility.notNull(ctx, "Target Application_Context is null"); 


    T raw_object= (T) ctx.getBean((spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type); 

    ValidateUtility.sameType(raw_object, raw_type, "Target object isn't instance of a {} class", raw_type); 

    return raw_object; 
} 

我的問題是下面一行:

T raw_object= (T) ctx.getBean((spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type); 

此行並沒有編譯和展示以下編譯錯誤:

The method getBean(String) in the type BeanFactory is not applicable for the arguments (Serializable) 

但是當我將這一行更改爲以下行並編譯罰款:

T raw_object= null; 
if(spring_param.getBeanName()!=null) 
    raw_object= (T) ctx.getBean(spring_param.getBeanName()); 
else 
    raw_object= (T) ctx.getBean(raw_type); 

我含糊不清這個問題。

回答

6

這裏的問題是,編譯器無法檢測到第一個代碼段中您嘗試調用的方法,因爲您的三元運算符返回不同類型的對象,因此您會收到編譯錯誤,因爲您可以使用不同的上下文方法(按名稱 - 字符串,按類 - 類)。

假設你正在嘗試的

(spring_param.getBeanName()!=null)?spring_param.getBeanName():raw_type 

值設置爲任何變量,你必須告訴編譯器哪種類型將是您的變量。你可以在這裏爲你的變量類型使用任何東西,但是Object class,因爲他們沒有任何其他共同的祖先(我的意思是StringClass類)。

3

問題出在這樣的事實,即編譯器推斷三元運算符返回的類型,因此它不能選擇在應用程序上下文中調用哪個方法。