Java 泛型扩展返回方法转换错误

标签 java generics casting

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

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

我收到错误“无法从 List<SQLDataBean> 转换”至List<ReplacementsBean> .

最佳答案

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

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

在临时变量的情况下

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

编译器被迫实例化<T><ReplacementsBean>使作业顺利进行。

关于Java 泛型扩展返回方法转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497054/

相关文章:

c# - 动态创建类型的性能

具有类型的 Java 泛型列表类

C - 比较并将 char* 转换为 char

java - 权限被拒绝以从 Android 内部存储加载图像

尝试获取本地 jar 路径时 Java codeSource 空指针

java - 使用 java.lang.reflect.Type 检查实例

c# - 应用于通过反射创建的实例的显式转换运算符

c - 类型转换和位操作之谜

java - 由于奇怪的原因无法读取文件

java - 多个执行器任务通知主节点已完成?