java - 从实现类推断泛型类型
问题描述
假设我有一个Pipeline<T>
包含一些 Type 元素的抽象类和一个扩展T
的实现类。IntPipeline
Pipeline<Integer>
abstract class Pipeline<T> {
abstract T getNextItem();
}
class IntPipeline extends Pipeline<Integer> {
Integer getNextItem() {
// generate integer here
return 0;
}
}
现在我想写一些测试。由于 的所有实现Pipeline
都会有类似的测试,我想创建一个抽象基类来定义一些标准测试:
abstract class PipelineTest<S, T extends Pipeline<S>> {
private final Class<T> clazz;
protected PipelineTest(Class<T> clazz) {
this.clazz = clazz;
}
abstract T createInstance();
@Test
void canBeSerializedAndDeserialzed() {
var serializer = ...;
T pipeline = createInstance();
var json = serializer.toJson(pipeline);
T deserializedPipeline = serializer.fromJson(json, clazz);
assertEquals(pipeline, deserializedPipeline);
}
}
所以具体的测试看起来像这样:
class IntPipelineTest extends PipelineTest<Integer, IntPipeline> { // redundant information here
IntPipelineTest() {
super(IntPipeline.class);
}
IntPipeline createInstance() {
return new IntPipeline();
}
}
正如你所看到的,当我创建一个具体的测试时,我需要在那里传递冗余信息。我告诉编译器,我将为类型管道创建一个测试Integer
。据我了解,这可以从IntPipeline
. 因此,我怀疑我在使用泛型做一些根本错误的事情。
那么有什么方法可以重构代码,这样我就可以创建测试而无需Integer
显式声明类型?
解决方案
推荐阅读
- regex - 如何使用 htaccess 文件从不干净的 url 重定向到干净的 url
- java - 如果我正在查看某个点,请打印信息
- algorithm - 将生成所需输出的魔法序列的 C++ 算法代码
- c - 在 C 中,有没有办法将一个程序的返回值传递给另一个程序?
- linux - Adacore GNATCOLL 库未安装在 CentOS 8 上
- python - 如何从命令行访问程序的文档字符串?
- c++ - 如何使用 count_if 函数计算向量中元素的频率?
- node.js - 带有 npm 私有包的 Heroku CI/CD
- c++ - 在 Windows 上,使用 C++ 可以从给定函数 ptr 以编程方式获取程序集的字符串名称
- javascript - 如何从用 Vuex 商店编写的 vuetify 表单中获取更改的对象字段