Consider the following (GROOVY-10646 excerpt):
interface Output<T> {
T getT()
}
abstract class WhereDSL<Type> {
abstract Type where()
}
abstract class Input<T> extends WhereDSL<ReferencesOuterClassTP> {
class ReferencesOuterClassTP implements Output<T> {
@Override T getT() {
return null
}
}
}
class Model {
}
void m(Input<Model> input) {
def output = input.where()
def result = output.getT()
// ^^^^^^ expect Model
}
Override method getT() makes reference to outer class type parameter T. "output" infers as ReferencesOuterClassTP but "result" does not infer as Model.
