2013-06-20 4 views
4

Im пытается создать методы перегружать в Java:Java Дженерики и метод подписи

private BasesResponse getResponse(List<ClassA> classA) { 
... 
} 

private BasesResponse getResponse(List<ClassB> classB) { 
    ... 
} 

Но затмение жалуется: Метод getResponse(List<ClassA>) имеет тот же стирание getResponse(List<E>) как другой метод в типа BasisInformationEndpoint.

Я думал, метод подпись метод имя + список партией .... но как может List<ClassA> быть таким же, как List<ClassB>? Не имеет смысла для меня.

+3

Подробнее о стирании стилей: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#Type%20Erasure –

+0

это имеет смысл, и это хороший вопрос. я уверен, что кто-то напечатает вам хорошее объяснение. –

+0

Как только вы поймете [Тип Erasure] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html), вы поймете, почему –

ответ

2

Общие типы (<...>) присутствуют только до этапа компиляции, которые будут использоваться для статического ввода.

После скомпилирования эти типы «стерты» и List<ClassA> по существу становится List. Таким образом, вы можете видеть, что когда это произойдет, ваши две функции становятся идентичными.

Это называется стиранием типа, как уже упоминалось комментатором.

5

Java generic type erasure сделает

private BasesResponse getResponse(List classA) { 
... 
} 

private BasesResponse getResponse(List classB) { 
    ... 
} 

После типа стирания это то же самое для компилятора.

1

Это невозможно. Для обратной совместимости общие параметры отбрасываются во время выполнения (в отличие, например, от C#). Это называется стиранием типа.

Поэтому a List<Whatever>, во время выполнения, является только List. Это означает, что оба ваших метода имеют прототип BasesResponse getResponse(List), что является ошибкой компиляции.

1

Компилятор Java также erases type parameters в аргументах общего метода.

Вы можете увидеть два параметра как разные, но при удалении <> JVM увидит в качестве типа своих параметров два метода.

Ошибка при перегрузке.

1

Generic тип стирания:

Причина этого на самом деле из-за дженериков, List<ClassA> и List<ClassB> До Java 1.5 не было никаких Дженерики, список были объявлены как. как List. Это означает, что вы можете поместить что-либо в указанный список, прежде чем будет законно добавлять Object, String, ClassA, Listener и т. Д. Только в один список. Были введены обобщения для указания коллекций, которые они будут получать. Здесь находятся: List<ClassA>, List<String> и т. Д.

Однако для того, чтобы сохранить устаревшие системы тех, кто создал свое системное предустановленное время, это будет проблемой, Generics - это налагаемое время компиляции, но во время выполнения он все равно будет тем же самым базовым списком ранее.

Так, чтобы ответить на ваш вопрос, чтобы Eclipse, это и тот же метод подписи приема одного параметра:

private BasesResponse getResponse(List classX) { ... }

0

Потому что для Java параметр типа List<ClassA> и List<ClassB> является такой же, как List<E> ,

Вы можете решить эту проблему с помощью разных имен методов или, если ClassA и ClassB имеют одинаковый родитель, используйте getResponse(List<? extends ClassABParent> param).

0

Это потому, что компилятор все еще поддерживает унаследованный код, и именно поэтому он стирает общий тип considering.you может найти тот же вопрос отвечает here

1

Это происходит потому, что после прохождения через type erasure оба метод выйдет быть таким:

private BasesResponse getResponse(List classA) { 
... 
} 

private BasesResponse getResponse(List classB) { 
    ... 
} 

Два одинаковых метода с одной и той же подписью. Какой из них не перегружен, а ошибка времени компиляции.

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