Return subclass type from super thread method

public abstract class BaseClass<T extends BaseClass<T>> {

    T method1(){
        return getThis();
    }

    public  abstract T getThis();
}

public class SubClass extends BaseClass<SubClass> {
    public SubClass getThis(){
        return this;
    }
}

If this is only one level of inheritance, I can do something similar above and get a link to SubClass when calling method1 ().

What if I have inheritance at two levels, for example

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> {



}

what should I change to method1 and BaseClass so that when I call method1 I can return the type SubSubClass1. I will not do this without any suppression warnings.

+4
source share
2 answers

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. , .

+1

SubSubClass1 getThis(), :

public abstract class BaseClass<T> {
    T method1(){
        return getThis();
    }
    public abstract T getThis();
}

public abstract class SubClass1<T> extends BaseClass<T> {
}

public class SubSubClass1 extends SubClass1<SubSubClass1> {
    @Override
    public SubSubClass1 getThis() {
        return this;
    }
}
0

Source: https://habr.com/ru/post/1589293/


All Articles