我已尝试将此问题压缩到尽可能少的代码量。
我已经用 Row
定义了一个表结构,比如数据库表。和 Table
下面的类。 Table
本质上是 Row
的列表.我希望子类定义它们的特殊风格 Table
和 Row
我希望编译器捕获将一种类型的行放入不兼容类型的表中的不当尝试。
摘要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;
}
}
在底部:
-
method1
的FinalAgent
编译,但我必须写Table<FinalRow> t1 = new FinalAgent().method1(null);
以便调用该方法。 -
method2a
的FinalAgent
我将返回类型更改为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/