1

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

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

然后我有一个名为 ReplacementBean 的对象,它扩展了 SQLDataBean。

在另一堂课中,我有一个List<ReplacementBean>带有 set 方法的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 方法之前不必执行设置临时局部变量的两行过程?虽然它确实有效,但不必这样做会很好。

调用以下内容:

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

我收到错误 Cannot cast from List<SQLDataBean>to List<ReplacementsBean>

4

2 回答 2

2

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

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 回答