Java 从实现类推断泛型类型
假设我有一个抽象类Java 从实现类推断泛型类型,java,generics,Java,Generics,假设我有一个抽象类Pipeline,它包含一些T类型的元素,还有一个扩展Pipeline的实现类IntPipeline 因此,具体测试如下所示: class IntPipelineTest extends PipelineTest<Integer, IntPipeline> { // redundant information here IntPipelineTest() { super(IntPipeline.class); } IntPipeline cr
Pipeline
,它包含一些T
类型的元素,还有一个扩展Pipeline
的实现类IntPipeline
因此,具体测试如下所示:
class IntPipelineTest extends PipelineTest<Integer, IntPipeline> { // redundant information here
IntPipelineTest() {
super(IntPipeline.class);
}
IntPipeline createInstance() {
return new IntPipeline();
}
}
类IntPipelineTest扩展了PipelineTest{//此处的冗余信息
IntPipelineTest(){
super(IntPipeline.class);
}
IntPipeline createInstance(){
返回新的IntPipeline();
}
}
正如您所看到的,当我创建一个具体的测试时,我需要在那里传递冗余信息。我告诉编译器,我将为Integer
类型的管道创建一个测试。根据我的理解,这可以从IntPipeline
中推断出来。因此,我怀疑我在泛型上犯了一些根本性的错误
那么,有没有办法重新构造代码,这样我就可以创建一个测试,而无需声明
整数类型明确性?当抽象类只有抽象方法时,那么,测试抽象类就没有意义了,只需使用一个现有的子类作为代理,而不是使用测试实现。我基本上是在创建一些测试(比如可以序列化和反序列化
),应该为抽象类的每个实现执行这些测试。因此,我们的想法是,每当有人创建一个新的管道
,他们就可以从PipelineTest
中派生测试,并自动执行大量测试。当抽象类只有抽象方法时,那么,测试抽象类就没有意义了,只需使用一个现有的子类作为代理,而不是使用测试实现。我基本上是在创建一些测试(比如可以序列化和反序列化
),应该为抽象类的每个实现执行这些测试。因此,我们的想法是,每当有人创建一个新的管道
,他们就可以从管道测试
中派生出他们的测试,并自动执行许多测试。
class IntPipeline extends Pipeline<Integer> {
Integer getNextItem() {
// generate integer here
return 0;
}
}
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();
}
}