Это довольно сложный, но достаточно распространенный способ определения двух типов, которые тесно связаны друг с другом и всегда должны использоваться в тандеме.
JobT
- это конкретный тип задания, который оба знают о себе (Job<JobT
), а также знает о RunT
(,RunT
).
Точно так же RunT
может знать о себе и JobT
.
Это обеспечиваетчто Run.getNextBuild()
всегда может возвращать конкретный тип самого себя (без типа RunT
ему придется возвращать универсальный Run
) и что getParent()
может возвращать конкретный JobT
.
без оба этих параметров код, подобный этому, не будет работать:
SomeSpecificRun myRun = ...;
SomeSpecificJob myJob = myRun.getParent();
SomeSpecificRun previousSuccessfulRun = myJob.getPreviousBuild();
Если Job
не "знает" (то есть имеет параметр типа) тип прогона и Run
«знает» (то есть имеет параметр типа) тип задания, он не может ссылаться на конкретные классы Run / Job и быстро превращается в ручное приведение к конкретному классу.