Метод имеет (неожиданно) такое же стирание, что и другой метод

Я прочитал все другие вопросы по этому поводу, но не могу понять, почему в моем случае происходит стирание типа. у меня есть

public <T extends Aclass&Binterface> boolean test(final T param) {
    ...
}

public boolean test(final Aclass pOtherPPShape) {
    ...
}

Тест метода (Aclass) имеет тот же тест на стирание (Aclass), что и другой метод в типе ClassName

Как мне написать два метода, которые работают с одним и тем же классом, но один с интерфейсом, а другой - нет? (я не могу изменить AClass, так как он взят из внешней библиотеки и у меня много подтипов, с которыми должен работать этот код)

Правильно ли в этом случае использование instanceof?

РЕДАКТИРОВАТЬ: я использую это в тесте на столкновение. Если переданная форма является экземпляром интерфейса, я получаю маску столкновения (с методом интерфейса), а затем вызываю «средство проверки», если это не так, я хочу создать экземпляр фиктивной маски столкновения, которая выполняет некоторые другие действия и передать тот же метод "проверки" (который имеет в качестве параметров 2 формы и 2 маски столкновения)


person Makers_F    schedule 31.07.2012    source источник
comment
Чего вы хотите здесь достичь? Вы можете отказаться от того, что хотели бы делать?   -  person Richard Sitze    schedule 31.07.2012
comment
как насчет определения второго метода public <T extends Aclass> boolean test(final T param)   -  person Sebastian Hoffmann    schedule 31.07.2012
comment
У них все равно будет такое же стирание.   -  person Richard Sitze    schedule 31.07.2012
comment
@RichardSitze Я редактировал вопрос   -  person Makers_F    schedule 31.07.2012


Ответы (1)


Вы осознали, что проблема заключается в стирании типа и что вы не можете перегрузить один параметр с помощью стирания типа (стирание типа - вы будете ассимитированы). Но вы говорите,

Сигнатуры универсального типа различны, почему возник конфликт?

Два типа T extends Aclass&Binterface и Aclass различны, не так ли?

Ну и да, и нет. Хотя на самом деле они различны, при стирании типа они не различимы ** 1. В отличном ресурсе объясняется: В процессе стирания типа компилятор заменяет параметры типа их крайняя левая граница. В вашем случае это было Aclass, что привело к конфликту между двумя методами.

Объяснение предполагает ...

Решение: формализовать объявление универсального типа combound ** 2, чтобы установить уникальную крайнюю левую границу

Замените <T extends Aclass&Binterface> на <T extends AandB>, где AandB создается таким образом:

  1. Определите interface Ainterface с Aclass сигнатурами методов

  2. Есть Aclass implement Ainterface

  3. Определите interface AandB extends Ainterface, Binterface.

OR

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


** 1 Потому что более длинные волны преломляются частицами в атмосфере, согласно Дункану Джонсу, еще один отличный ресурс.

** 2 Это было бы compound, потому что я не мог устоять перед весельем: - /

person Richard Sitze    schedule 31.07.2012
comment
Хорошо, но почему происходит стирание типа? Разве компилятор не знает, когда он компилирует код, является ли класс экземпляром Binterface или нет? Метод с классом в качестве параметра и класс, который также реализует интерфейс, обрабатываются одинаково? - person Makers_F; 31.07.2012
comment
Каждый раз, когда мне приходится иметь дело с java generic, они падают, как будто они сужаются ... Кстати, спасибо, в конце я решаю использовать проверку instanceof: намного проще и читабельнее. - person Makers_F; 01.08.2012
comment
@RichardSitze Потому что более длинные волны преломляются частицами в атмосфере ;-) - person Duncan Jones; 01.08.2012
comment
@DuncanJones Спасибо, я обновил свой ответ, чтобы включить ваши идеи! - person Richard Sitze; 01.08.2012
comment
@Makers_F И теперь, я думаю, у меня есть окончательный ответ, почему - person Richard Sitze; 01.08.2012
comment
Хороший ответ! К сожалению, у меня нет такого интерфейса A (но кодировщик движка, который я использую, создал множество этих интерфейсов, просто Aclass, который я использую, на самом деле является классом между формой и спрайтом), но мне нравится решение вы предложили, даже если я думаю, что это нетривиальное решение можно было бы решить, если бы у дженериков был лучший дизайн! - person Makers_F; 01.08.2012