Кажется, у вас есть две строки Product
концепций здесь.Что вы можете сделать, это сделать BaseProduct
и Account
абстрактными и использовать дженерики.
public abstract class BaseProduct<A extends Account> {
public abstract A getAccount();
}
class ProductOne extends BaseProduct<TypeOneAccount> {
FieldOne fieldOne = new FieldOne();
}
class ProductTwo extends BaseProduct<TypeTwoAccount> {
FieldTwo fieldTwo = new FieldTwo();
}
Это позволит конкретным типам "продукта" быть привязанным к конкретным Account
типам.
Затем удалите methodOne
и methodTwo
из Account
и реализуйте их в фактических классах «типа один» и «типа два»:
public abstract class Account {
}
public class TypeOneAccount extends Account {
public TypeOne methodOne() {
return typeOne;
}
}
public class TypeTwoAccount extends Account {
public TypeTwo methodTwo() {
return typeTwo;
}
}
При этом оба из следующихошибка во время компиляции :
//fails because productOne.getAccount() returns a TypeOneAccount object,
//which doesn't have methodTwo()
productOne.getAccount().methodTwo()
//fails because productTwo.getAccount() returns a TypeTwoAccount object,
//which doesn't have methodOne()
productTwo.getAccount().methodOne()