У меня есть довольно центральный класс, отвечающий за некоторые методы Utility. Я хотел, чтобы обеспечить дополнительную перегрузку для метода, который был объявлен следующим образом:Стирание коллекций generics и конфликтующих перегрузок
public static void removeDuplicated(Collection fullList, Collection itemsToRemove) {
//implementation stripped for brevity
}
Теперь, так как я не очень люблю Rawtypes, я указал коллекции из в наименьший общий знаменатель можно ожидать:
public static void removeDuplicated(Collection<Map<?,?>> fullList,
Collection<Map<?,?>> itemsToRemove) {}
До сих пор так хорошо, что это избавилось от предупреждения о сырости и все в порядке до сих пор.
я продолжил писать заголовок метода для моей перегрузки:
public static <T extends TeObjectWrapper> void removeDuplicated(
Collection<T> fullList, Collection<Map<?,?>> itemsToRemove) {}
Это когда затмение (и впоследствии компиляции с javac6 через муравья) дал мне следующие сообщения об ошибке:
Стирание метод
removeDuplicated(Collection<T>, Collection<? extends Map<?,?>>)
такой же, как другой метод в типе [Утилиты-класс]
Теперь, поскольку у меня уже была моя доля про с помощью шаблонов подстановочных знаков и их стираний. Я попытался полностью определить все, заменив несвязанные подстановочные знаки на Object
. Сообщение об ошибке все еще сохраняется.
Теперь, как я понимаю, первая существующая перегрузка должна стереть до Collection<Map<Object, Object>>
, а вторая - стереть до Collection<TeObjectWrapper>
.
Единственным способом, которым это может быть одно и то же стирание, является то, что если TeObjectWrapper реализовал Map (или расширил один из классов реализации Map), но это не так. Это можно увидеть в супертипе иерархии TeObjectWrapper:
Почему компилятор рассматривать стираниям то же самое, и как я могу заставить его не думать?
Стирание 'Collection' '' 'Collection'. –
Из-за стирания подпись метода одинакова. Мессинг с дженериками не меняет подпись метода. – user489041