Помимо проблемы одной и той же реализации здесь основная проблема заключается в том, что несколько варварский «метод A и метод B имеют одно и то же стирание».
Что делает этот вопрос сложным, так это то, что мы, как правило, не знаем (по крайней мере, не этим утром) много знаем о «тире стирания».
Чтобы сделать это коротко:
Параметрические типы выполняют проверку типа во время компиляции (для обеспечения правильности ввода), но забудьте о своих параметрах типа во время выполнения (чтобы избежать генерации базовых методов).
blockquote>звучит в то же время просто и загадочно. Лучший способ понять это - обратиться к следующей литературе:
- Что такое повторно идентифицируемый тип?
- Как и под каким
- Есть ли у вас какие-либо идеи / примеры того, что это может означать в моей жизни кодирования?
- Well это странно, и мне это не очень нравится, но мне любопытно, почему они это сделали ...
Надеюсь, что это поможет вам, насколько это мне помогло.
Конкретный ответ:
В вашем случае
public abstract class ClassA { public static List
createSensors(Collection extends ClassA> list) { //do stuff } } public abstract class ClassB extends ClassA { public static List createSensors(Collection extends ClassB> list) { //do other stuff } } будет «преобразован» с помощью javac на
public abstract class ClassA { public static List createSensors(Collection list) { //do stuff } } public abstract class ClassB extends ClassA { public static List createSensors(Collection list) { //do other stuff } }
, где один явно не может переопределить другой (не такой же параметр типа), но в то же время в точности совпадают во время выполнения (нет возможности для вашей программы выбрать, какой из них использовать).
Хватит этой проблемы, как решить его? Вы можете перейти к одному из следующих способов:
- Использовать разные имена:
createASensors
иcreateBSensors
этот подход является наиболее очевидным, но выглядит немного менее изящным.- Добавить параметр:
createSensors(Collection extends ClassA> list, ClassA typeDefiner)
этот подход может показаться варварским, но немного менее изящным, но используется вjava.util.List
для метода.
T[] toArray(T[] a)