Поведение, которое вы пытаетесь выполнить, заключается в том, что вы хотите ссылаться на экземпляры подкласса с базовым классом / типом интерфейса, но вы хотите вызывать методы, специфичные для подклассов. Это противоречиво, потому что при обработке объектов, которые имеют разные типы, но имеют общую базу, предполагается, что процессор не заботится о подтипах, но в вашем случае процессор действительно заботится о подтипе и хочет сделать подтип конкретных вещей. Вы правы, что один из способов сделать это - проверить тип с помощью оператора instanceof и привести его, и да, это не очень элегантно.
Другой способ и, возможно, единственный способ, о котором я мог подумать, - это иметь другой метод с общим именем в CommonBase, такой как «делегат» или «процесс», без определения того, что он делает внутри, а затем обеспечить реализацию в подтипах. для этого метода.
interface CommonBase {
void delegate();
}
class SubTypeA implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
class SubTypeB implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
Надеюсь, это поможет.