1

ジェネリック型のリストを返すメソッド、以下に示すメソッドがあります。

    protected <T extends SQLDataBean> List<T> getJavaListFromOracleArray(Array array) throws SQLException

次に、SQLDataBean を拡張する ReplacementBean というオブジェクトがあります。

別のクラスList<ReplacementBean>では、List<ReplacementBean>

私が見つけたものと、セット内で上記のメソッドを呼び出すことができない理由がわかりません。これはコンパイル時エラーを与えることを意味します:

setReplacements(this.getJavaListFromOracleArray(in.readArray()));

ただし、以下はコンパイルして正常に動作します。

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray());
setReplacements(temp);

以下のように set メソッド内でキャストすることも試みましたが、これもコンパイル時エラーが発生します。

setReplacements((List<ReplacementsBean>)this.getJavaListFromOracleArray(in.readArray()));

set メソッドを呼び出す前に、一時的なローカル変数を設定する 2 行のプロセスを実行する必要がないようにする方法はありますか? それはうまくいきますが、それをする必要がないのはいいことです。

以下を呼び出します。

setReplacements(this.getJavaListFromOracleArray(in.readArray()));

のエラーになりますsetReplacements(List<ReplacementsBean>) is not applicable for the arguments List<SQLDataBean>

setReplacements コードは次のとおりです。

public void setReplacements(List<ReplacementsBean> replacements)
{
    this.replacements = replacements;
}

また、これを試してみると:

setReplacements((List<ReplacementsBean>)this.getJavaListFromOracleArray(in.readArray()));

List<SQLDataBean>からにキャストできませんというエラーが表示されList<ReplacementsBean>ます。

4

2 に答える 2

2

これは、コンパイラの型推論が期待どおりにうまくいかないケースの 1 つです。ジェネリック メソッド型パラメーターを明示的に指定すると、次のように動作するはずです。

setReplacements(this.<ReplacementsBean>getJavaListFromOracleArray(in.readArray()));

一時変数の場合

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray());
setReplacements(temp);

コンパイラは、割り当てを機能させるためにインスタンス<T>化を強制されます。<ReplacementsBean>

于 2012-11-21T16:20:30.097 に答える
0

問題は、コンパイラ内で次のことが行われることです。

List<X> temp = getJavaListFromOracleArray(in.readArray());
setReplacements(temp);

ここで、XはReplacementsBeanまたはその子である必要があります。そして、それは制限がありません。より多くの正式に型付けされた言語では、Xは解決されますが、Javaでは解決されません。したがって、次の必要性があります。

setReplacements(<ReplacementsBean>getJavaListFromOracleArray(in.readArray()));

ただし、この「欠陥」も明らかな症状です。おそらくgetJavaListFromOracleArray安全でないジェネリック医薬品です。

関数setReplacementsは、パラメーターaを使用して子クラスでオーバーライドされる可能性があることにも注意してくださいList<ReplacementsBeanChild>

于 2012-11-21T16:35:11.070 に答える