2016-03-23 3 views
1


Я хочу представить интерфейсы для классов, созданных XSD. Сначала мне нужно показать рабочую версию:AspectJ ITD Общий метод Параметр Разрывы Компиляция

public interface IBooking<T extends IChargeList> { 
    T getChargesList(); 
    void setChargesList(T value); 
} 

public aspect IntertypeDeclarationAspect { 
    declare parents:Booking implements IBooking<BookingChargeList>; 
    declare parents:BookingChargeList implements IChargeList; 
} 

Эта версия работает, но если я перееду дженерики в объявлении метода он не делает:

public interface IBooking { 
    <T extends IChargeList> T getChargesList(); 
    <T extends IChargeList> void setChargesList(T value); 
} 

public aspect IntertypeDeclarationAspect { 
    declare parents:Booking implements IBooking; 
    declare parents:BookingChargeList implements IChargeList; 
} 

Сообщение об ошибке: Booking.java:144 [error] The type Booking must implement the inherited abstract method IBooking.setChargesList(T)

Интересная часть не дает ошибки для метода getChargesList().

Что может быть причиной этого?

Родственный часть в классе бронирования, как это:

public BookingChargeList getChargesList() { 
    return chargesList; 
} 
public void setChargesList(BookingChargeList value) { 
    this.chargesList = value; 
} 
+0

Пожалуйста, добавьте соответствующую часть исходного кода класса бронирования, в частности объявление методов 'getChargesList()' и 'setChargesList()'. –

+0

@ NándorElődFekete Я добавил. – GokcenG

ответ

2

Работа с последней частью первой, тип возврата не является частью сигнатуры метода, а так getChargesList() не имеет параметров, аспект это правильно реализует. Его тип возврата не будет связан во втором примере, но это не имеет значения.

Что касается того, почему setChargesList(T) не реализован, это связано с тем, что 'T' не определено. Когда сигнатура метода интерфейса использует определение общего типа на уровне метода, это определение должно также существовать в реализации. Так что это действительно:

@Override 
public <T extends IChargeList> void setChargesList(final T value) { 
} 

Но это не так:

@Override 
public void setChargesList(final T value) { 
} 

И его, что второй пример, который AspectJ генерирует

Я боюсь, что мой AspectJ не достаточно хорошо, чтобы сказать вы, как решить свою проблему, но я надеюсь, что это поможет вам разобраться в происходящем.