Return Class <T> From Method

I have two classes that extend a common base class. The base class has code that for one particular subclass must know Classanother specific subclass. Thus, when using Fooand Barextending Base, the instance Foomust know Bar.class, and the instance Barmust know Foo.class.

And, silly, I'm trying to do the right thing and use generic Java methods to ensure that subclasses return a valid Java class object that extends the base class.

So, I tried this:

class Base {
  abstract protected <T extends Base> Class<T> getOtherClass();
}

The compiler seems quite pleased with this design. The problem arises in implementation.

First I tried:

class Foo extends Base {
  @Override
  protected <T extends Base> Class<T> getOtherClass() {
    return Bar.class;
  }
}

(where Baralso continues Base)

, , .

:

class Foo extends Base {
  @Override
  protected Class<Bar> getOtherClass() {
    return Bar.class;
  }
}

Class<Bar>.

:

class Foo extends Base {
  @Override
  protected Class<Base> getOtherClass() {
    return Bar.class;
  }
}

: Class<Base> .

, - ?

+4
1
abstract class Base<T extends Base> {
  abstract Class<T> getOtherClass();
}
class Foo extends Base<Bar> {
   @Override Class<Bar> getOtherClass() { return Bar.class; }
}

... ...

abstract class Base {
   abstract Class<? extends Base> getOtherClass();
}
class Foo extends Base {
   @Override Class<Bar> getOtherClass() { return Bar.class; }
}
+6

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


All Articles