从方法

时间:2017-04-10 22:46:46

标签: java

我有两个扩展公共基类的类。基类具有代码,对于一个具体的子类,需要知道另一个具体子类的Class。因此,在FooBar延长Base的情况下,Foo的实例需要知道Bar.class,而Bar的实例需要知道Foo.class

而且,愚蠢的我,我正在尝试做正确的事情并使用Java泛型来确保子类返回一个有效的Java类对象,扩展基类。

所以,我试过这个:

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

编译器似乎对这种结构感到满意。问题出现在实现中。

首先,我试过了:

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

Bar也扩展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> 中投放返回值。

有没有一种表达方式可以避免任何演员阵容?

1 个答案:

答案 0 :(得分:6)

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; }
}