2010-10-05 4 views
8

Где я пытаюсь создать два статических метода перегрузки, я получил ошибку компиляции. Может кто-нибудь объяснить этоПерегрузка статического метода с помощью генераторов

public class A { 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 
} 
+0

Какая ошибка? – kasten

ответ

14

Причина: type erasure. Дженерики не хранятся в классах, они являются только информацией времени компиляции, поэтому во время выполнения эти два метода идентичны, и, следовательно, существует конфликт имен.

Ссылка

Эти три метода практически идентичны (читай: они производят одинаковую байткод):

public static void a(Set plainSet) {} 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 

Если вы действительно хотите иметь два разных метода, вы должны предоставить различные сигнатуры методов (например, разные имена методов, дополнительный параметр для одного из методов и т. д.)

+0

Разрешение метода выполняется во время компиляции, поэтому язык Java можно расширить, чтобы разрешить такую ​​перегрузку без овеществления. Однако, вероятно, проще настаивать на более эффективном наименовании методов. –

+0

Да, но цель заключалась в том, чтобы не нарушать двоичный формат (старый код должен был продолжать работать, даже с новым кодом) –

1

С точки зрения методов параметры Set<String> и Set<Map<String,String>> совпадают, поскольку все экземпляры универсального класса имеют одинаковый класс времени выполнения (Установите в вашем случае), независимо от их фактических параметров типа. Поэтому вы получите erasure error. Также во время выполнения, как будет выглядеть ... public static void a(Set stringSet) {} И public static void a(Set mapSet) {}

0

Вы получили ошибку компилятора, поскольку методы не перегружены должным образом. Оба метода имеют параметр типа Set, который делает оба метода одинаковыми для его компилятора.

Смежные вопросы