Я сделал этот ответ как комментарий, но с небольшим размышлением (мышление, а не кодирование!) Я превращаю его в ответ.
Поскольку у вас нет контролячерез A или B, и B имеет доступ к пакету, вы можете видеть его только из классов, находящихся в том же пакете, что и A. Так что вы можете сделать - если вы не хотите перемещать C в тот же пакет - написатьслужебный класс - назовите его U - с булевой функцией, принимающий X и возвращающий, является ли он экземпляром AB