Как проверить instanceof на обобщенном классе? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть метод equals(), который содержит этот код:

if (other instanceof Peach<K, V>) {
    ...
}

Однако это не компилируется.Как исправить эту строку кода?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Как уже указывалось, это невозможно.Я хотел бы добавить, что это из-за того, что известно как Тип Erasure .Официальный учебник по Java содержит следующую краткую сводку:

В язык Java были введены общие сведения для обеспечения более строгих проверок типов во время компиляции и для поддержки общего программирования.Для реализации обобщений Java-компилятор применяет стирание типов к:

  • Заменить все параметры типа в универсальных типах их границами или Object, если параметры типа не ограничены.Поэтому созданный байт-код содержит только обычные классы, интерфейсы и методы.
  • Вставьте приведение типов в случае необходимости, чтобы сохранить безопасность типов.
  • Создайте методы-мосты, чтобы сохранить полиморфизм в расширенных обобщенных типах.

Стирание типов гарантирует, что новые классы для параметризованных типов не создаются;следовательно, генерики не несут затрат времени выполнения.

Ключ здесь "Таким образом, полученный байт-код содержит только обычные классы, интерфейсы и методы." .По этой причине невозможно выполнить проверку instanceof, которую вы пытаетесь выполнить.

0 голосов
/ 15 ноября 2018

Короче, ты не можешь.Java стирает универсальные типы, поэтому во время выполнения у вас больше нет этой информации.

Вы можете использовать

if (other instanceof Peach) {
    ...
}
...