java - 返回值的 Java 类型参数问题

标签 java type-parameter

我已尝试将此问题压缩到尽可能少的代码量。

我已经用 Row 定义了一个表结构,比如数据库表。和 Table下面的类。 Table本质上是 Row 的列表.我希望子类定义它们的特殊风格 TableRow我希望编译器捕获将一种类型的行放入不兼容类型的表中的不当尝试。

摘要Agent类提供了一种方法来获取参数并返回一个包含 T 类型行的表.我定义了三种方法来说明我遇到的问题。

FinalAgent , FinalTable , 和 FinalRow类定义了 Agent 的实现, Table , 和 Row类。最终,我想要的是 method2a ,它采用参数列表并返回类型为 FinalTable 的表.

public abstract class Row {}
public abstract class Table<T extends Row> {}
public abstract class Agent {
    public <T extends Row> Table<T> method1(List<String> parameter) {
        return null;
    }
    public <T extends Row> Table<T> method2a(List<String> parameter) {
        return null;
    }
    public <T extends Row> Table<T> method2b(String parameter) {
        return null;
    }
}

public class FinalRow extends Row {}
public class FinalTable extends Table<FinalRow> {}
public class FinalAgent extends Agent {
    @Override
    public <T extends Row> Table<T> method1(List<String> parameter) {
        return null;
    }
    @Override
    public FinalTable method2a(List<String> parameter) {
        return null;
    }
    @Override
    public FinalTable method2b(String parameter) {
        return null;
    }
}

在底部:

  • method1FinalAgent编译,但我必须写 Table<FinalRow> t1 = new FinalAgent().method1(null);以便调用该方法。
  • method2aFinalAgent我将返回类型更改为 FinalTable反射(reflect)我实际返回的内容(我想写 FinalTable t2a = new FinalAgent().method2a(null); ),但编译器产生错误:类型为 FinalAgent 的方法 method2a(List) 必须覆盖或实现父类(super class)型方法
  • method3我从 List 更改了参数到 String .该方法编译正常,但给了我一个类型安全警告,我至少可以使用它。

所以,最后,问题是:method2a 是否是一个编译器错误?在FinalAgent尚未编译 method2b会编译吗?

我不妨也问一下,有没有更好的方法来做我正在做的事情?

最佳答案

不清楚您为什么要对这些方法进行参数化。您 promise 返回一个 Table<T> , 但您的方法无法识别 T在运行时因为类型删除。您可能想要参数化整个 Agent改为上课:

public abstract class Agent<T extends Table<?>> {
    public T method1(List<String> parameter) {
        return null;
    }
    public T method2a(List<String> parameter) {
        return null;
    }
    public T method2b(String parameter) {
        return null;
    }
}

public class FinalAgent extends Agent<FinalTable> {
    @Override
    public FinalTable method1(List<String> parameter) {
        return null;
    }
    @Override
    public FinalTable method2a(List<String> parameter) {
        return null;
    }
    @Override
    public FinalTable method2b(String parameter) {
        return null;
    }
}

关于您最初的问题,我无法理解 method2b 上的差异或警告消息。 .

关于java - 返回值的 Java 类型参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39884174/

相关文章:

java - spring应用索引的使用

java - Toolkit 返回对专有 Sun API 的引用?

java - 我可以创建一个作为泛型类型参数的成员变量吗?

scala - 抽象类型与类型参数 - 区别在哪里?

java - 在 websphere 中打开 URL 连接

需要 Java 导入说明

java - 如何使用 setSelectedValue 将多个项目设置为在 JList 中选择?

Java 泛型 : assignment with nested wildcard parameters

scala - Scala 可以在参数中允许自由类型参数吗(Scala 类型参数是一等公民吗?)?

尽管是实例,但 Java 未经检查强制转换为类型参数警告