Проблема в том, что вы обращаетесь к другому защищенному экземпляру.
Вы можете применить несколько решений, например, если возможно, вы можете объявить в родительском классе эти два метода:
protected void copyRelationStructure(Relation r) {
this.copyStructure(r.mStructure);
}
protected void mergeRelationStructure(Relation r) {
for (final Header header: r.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
}
А затем в коде ребенка заменить:
this.copyStructure(mRelLeft.mStructure);
for (final Header header :mRelRight.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
С:
this.copyRelationStructure(mRelLeft);
this.mergeRelationStructure(mRelRight);
Это должно сработать. Теперь Relation несет ответственность за предоставление методов, которые позволяют своим дочерним элементам выполнять операции с самим собой. Вероятно, причина этой политики заключается в том, что дети не должны связываться с внутренними компонентами родителей, если они не являются частью одного и того же пакета программного обеспечения для ограничения несовместимости.