首页 > 解决方案 > 从实现类推断泛型类型

问题描述

假设我有一个Pipeline<T>包含一些 Type 元素的抽象类和一个扩展T的实现类。IntPipelinePipeline<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显式声明类型?

标签: javagenerics

解决方案


推荐阅读