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);

私はこの問題があいまいです。

4

2 に答える 2

6

ここでの問題は、三項演算子が異なるタイプのオブジェクトを返すため、最初のスニペットでどのメソッドを呼び出そうとしているかをコンパイラが検出できないことです。したがって、異なるメソッドを使用してコンテキストから Bean を取得できるため、コンパイル エラーが発生します (名前で)。 - 文字列、クラス別 - クラス)。

の値を設定しようとしているとします。

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

任意の変数に対して、どのタイプが変数になるかをコンパイラーに伝える必要があります。ここでは、変数の型には何も使用できませんがObject class、他の共通の祖先 (StringおよびClassクラス) がないためです。

于 2013-03-09T08:55:59.707 に答える
3

問題は、コンパイラが三項演算子によって返される型を推測するため、アプリケーション コンテキストで呼び出すメソッドを選択できないことにあります。

于 2013-03-09T08:57:31.273 に答える