2015-04-27 4 views
4

я есть класс A, который расширяет класс B и класс B переопределение расширяет универсальный классошибка метода класса, который расширяет универсальный класс

мой класс А является:

public class MyCustomerReviewConverter<SOURCE extends CustomerReviewModel, TARGET extends ReviewData> extends CustomerReviewConverter{ 

    @Override 
    public void populate(final SOURCE source, final TARGET target) {.....} 

расширенного класса B является

public class CustomerReviewConverter extends AbstractPopulatingConverter<CustomerReviewModel, ReviewData>{ 

    @Override 
    public void populate(final CustomerReviewModel source, final ReviewData target) 
    {..........} 

, но я получаю ошибку

Name clash: The method populate(SOURCE, TARGET) of type MyCustomerReviewConverter<SOURCE,TARGET> has the same erasure as populate(CustomerReviewModel, ReviewData) of type 
    CustomerReviewConverter but does not override it 

что не так?

В качестве второго параметра в методе заселить я должен передать класс

MyReviewData extends ReviewData{...} 

заранее спасибо

Andrea

ответ

2

Трудно и сложно объяснить.

  1. Параметры типа определены в общем AbstractPopulatingConverter.
  2. Параметры типа конкретизируются в CustomerReviewConverter.
  3. Затем вы попытаетесь снова создать параметры конкретизированного типа в MyCustomerReviewConverter.

И это просто не работает. Вы пытаетесь переопределить метод методом, который имеет другую сигнатуру метода (разные типы параметров).

Единственным способом вы можете переопределить этот метод заключается в следующем:

@Override 
public void populate(final CustomerReviewModel source, 
     final ReviewData target) { /* ... */ } 

Однако вместо перекрывая метод, вы можете перегрузки это:

public void populate(final MyCustomerReviewModel source, 
     final MyReviewData target) { /* ... */ } 

Если populate() метод вызывается на объект типа MyCustomerReviewConverter с параметром MyCustomerReviewModel и MyReviewData, компилятор будет, выберите наиболее подходящий способ populate, являясь перегруженным.

+1

нормально, спасибо за подтверждение .... Я предположил, что :-) – Andrea

0

Вы должны расширить CustomerReviewConverter<SOURCE, TARGET> (возможно, вы не добавили его определение на вопрос) вместо необработанного типа. Затем вам нужно переопределить public void populate(SOURCE source, TARGET target).

+0

CustomerReviewConverter - это не общий класс, который расширяет общий класс .... он находится внутри библиотеки, я не могу изменить – Andrea

1

Типы типовых типов для <SOURCE, TARGET> уже были зациклированы на B как <CustomerReviewModel, ReviewData>. Если вы хотите продлить B, ваши А должен быть просто:

public class MyCustomerReviewConverter extends CustomerReviewConverter { 
    @Override 
    public void populate(final CustomerReviewModel source, final ReviewData target) 
     { ... } 
} 

В противном случае вам нужно продлить AbstractPopulatingConverter непосредственно, и, возможно, написать делегат для выполнения общей логики в B, так что вы можете повторно использовать его в другом месте.

@Robby Cornelissen объясняет это лучше, чем я, в его ответе.

+1

Упомянуто для предложения делегата. –

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