派生类中的继承字段 - 两种解决方案都显得蹩脚

h22*_*h22 3 java oop inheritance

我有一些类X与外地A的吧.它是一个final结构域,在构造函数中初始化.现在我有一个派生类Y,其中该字段必须始终B是派生自的类的实例A.问题是,类Y需要调用一些特定的方法,这些方法只能在B类上使用,而不能在它的祖先上使用A.

我看到几个解决方案:

  1. 重用类型的字段A,继承自X类和类内部Y,强制转换AB.这使我的代码充满讨厌的类型转换.
  2. 添加该类型的另一个字段B.现在没有类型转换,但我们有两个略有不同类型的字段,必须始终保持相同的值 - 也感觉不太好.
  3. 添加B提供的所有方法A,throw NotImplementedException.这增加了一些奇怪的方法,故意在那个课程中毫无意义.

哪种方式最适合这个领域?或者其他一些,更好的存在?我认为这不是特定于语言的,但我必须在Java中使用.

JB *_*zet 5

X类型应该是泛型类型:

public class X<T extends A> {

    protected T a;

    public X(T a) {
        this.a = a;
    }
}

public clas Y extends X<B> {

    public Y(B b) {
        super(b);
    }

    public void foo() {
        // here, this.a is of type B, without any type cast.
    }
}
Run Code Online (Sandbox Code Playgroud)