It is important to understand that each type of parameter type of a class type is its own. In particular, they (the parameters themselves) are not shared with super- or subclasses. Typically, for subclasses with type parameters, they intentionally share the values of the type parameters with their superclasses, but this is another thing.
, . , SubClass1 extends BaseClass<SubClass1<T>>, BaseClass SubClass1<T>, SubClass1<T>, , SubClass1<T> .
BaseClass<T> getThis(), (, SubClass1), BaseClass type T ( ). , getThis(), BaseClass, SubClass1, , SubClass1 . , :
public abstract class BaseClass<T extends BaseClass<T>> {
public abstract T getThis();
}
public abstract class SubClass1<T extends SubClass1<T>> extends BaseClass<SubClass1<T>> {
@Override
public SubClass1<T> getThis() {
return this;
}
}
public class SubSubClass1 extends SubClass1<SubSubClass1> {
@Override
public SubSubClass1 getThis() {
return this;
}
}
, , :
public abstract class BaseClass {
public abstract BaseClass getThis();
}
public abstract class SubClass1 extends BaseClass {
@Override
public SubClass1 getThis() {
return this;
}
}
public class SubSubClass1 extends SubClass1 {
@Override
public SubSubClass1 getThis() {
return this;
}
}
@HannoBinder, .
, , , BaseClass , , , , . BaseClass<SomeSubClass> , SomeSubClass. , .