Как List <Long>может ссылаться на ArrayList со значениями BigInteger - PullRequest
0 голосов
/ 31 марта 2020

Этот метод определен в JpaRepository и запускает собственный запрос PostgreSQL.

List<Long> distributorIds = distributorRepository
.findDistributorIdsWithChildren(distributorId)

Он выполняется без исключений и во время выполнения. Я вижу значения BigInteger в возвращенном ArrayList вместо DistributiIds ArrayList вместо Long значения .

То же самое с этим вопросом: Ошибка в данных Spring JPA: Spring Data возвращает список вместо списка

Так как может ли эта ошибка возникнуть? Я имею в виду как JAVA позволяет это ? Если Java не проверяет ошибки такого типа, не является ли это проблемой с обобщениями в JAVA.

Примечание: я также проверил иерархию типов для Long и BigInteger, и нет подпрограммы / отношение суперкласса.

1 Ответ

2 голосов
/ 31 марта 2020

Generi c проверки типов являются функцией времени компиляции. Во время выполнения вся информация о типе теряется. Смотрите "стирание типа". Поведение, которое вы видите, может легко произойти, если, например, унаследованный API, который использует коллекции не-generi c, сопоставлен с API-интерфейсом, который использует дженерики и требует приведения коллекции. Если эта коллекция содержит объекты неожиданного типа, вы, к сожалению, узнаете об этом только во время выполнения.

...