Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从实现类推断泛型类型_Java_Generics - Fatal编程技术网

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();
  }
}