返回方法强制转换错误时的Java泛型扩展

返回方法强制转换错误时的Java泛型扩展,java,generics,casting,Java,Generics,Casting,我有一个返回泛型类型列表的方法,如下所示 protected <T extends SQLDataBean> List<T> getJavaListFromOracleArray(Array array) throws SQLException 但是,下面的代码编译并运行良好 List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray()); setReplac

我有一个返回泛型类型列表的方法,如下所示

    protected <T extends SQLDataBean> List<T> getJavaListFromOracleArray(Array array) throws SQLException
但是,下面的代码编译并运行良好

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray());
setReplacements(temp);
导致错误的
setReplacements(List)不适用于参数列表

SETREPLACES代码如下所示:

public void setReplacements(List<ReplacementsBean> replacements)
{
    this.replacements = replacements;
}
public void集合替换(列表替换)
{
这个。替换=替换;
}
如果我尝试以下方法:

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

我无法将错误从
List
转换为
List

这是编译器类型推断不如您希望的那样好的情况之一。在显式指定泛型方法类型参数的情况下,以下操作应该有效:

setReplacements(this.<ReplacementsBean>getJavaListFromOracleArray(in.readArray()));
setReplacements(this.getJavaListFromOracleArray(in.readArray());
在临时变量的情况下

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray());
setReplacements(temp);
List temp=this.getJavaListFromOracleArray(in.readArray());
设置替换(临时);

编译器被迫将
实例化为
,以使赋值生效。

问题在于编译器内部完成了以下操作:

List<X> temp = getJavaListFromOracleArray(in.readArray());
setReplacements(temp);
List temp=getJavaListFromOracleArray(in.readArray());
设置替换(临时);
其中X必须是ReplacementsBean或其子级。这是开放式的。在许多更正式的类型化语言中,X是解析的,而在java中不是解析的。因此,需要:

setReplacements(<ReplacementsBean>getJavaListFromOracleArray(in.readArray()));
setReplacements(getJavaListFromOracleArray(in.readArray());
然而,这个“缺陷”也是一个明显的症状:可能是不安全的泛型


还要注意的是,函数
setReplacements
可能会在子类中被重写,作为参数a
List

也会显示setReplacements的代码。编辑后会包含错误和setReplacements代码。因此,答案是,由于编译器的解释方式,我必须对临时变量执行两个步骤。@user1735869或者使用显式的
this.getJavaList…
语法。
List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray());
setReplacements(temp);
List<X> temp = getJavaListFromOracleArray(in.readArray());
setReplacements(temp);
setReplacements(<ReplacementsBean>getJavaListFromOracleArray(in.readArray()));