Простой ответ заключается в том, что один и тот же класс, загружаемый двумя разными загрузчиками классов, является другим типом, и никогда не допускается взаимное назначение двух типов. Вот и все. Вам нужно, чтобы оба класса использовали один и тот же загрузчик классов, чтобы получить общий класс.
Это обычно является результатом нарушения преимущественной отсрочки загрузки класса для родителя ClassLoader. Проще говоря, любой загрузчик классов должен сначала попросить своего родителя загрузить класс, прежде чем он попытается загрузить его сам. В противном случае возникают всевозможные «интересные» проблемы.
В вашем конкретном примере, поскольку A вызывал B, загрузчику классов B не удалось делегировать его родителю, поскольку, если A может видеть целевой класс, загрузчику классов B не нужно его загружать, учитывая, что A вызывал B и, следовательно, загрузчик класса А или его предок загрузили B.