У вас есть много вариантов. Это может помочь, если вы разместите интерфейсы для MonitoredDevice & DeviceTypeToExtend, чтобы мы могли получить более полное представление о том, чего вы надеетесь достичь.
обратная связь Мэллера имеет смысл; Вы, вероятно, не хотите делать все это с наследованием.
Одна возможность: использовать дженерики. Ваш интерфейс MonitoredDevice может выглядеть следующим образом:
public interface MonitoredDevice<E> {
E computeFoo();
void doBar();
}
Вы также можете использовать композицию (возможно, самую простую) или многоуровневую иерархию классов (не рекомендуется).