AspectJ ITD通用方法参数中断编译

时间:2016-03-23 01:20:03

标签: generics aop aspectj


我想介绍XSD生成的具体类的接口。首先,我需要展示工作版本:

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()方法提供错误。

可能是什么原因?

Booking类的相关部分如下:

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

1 个答案:

答案 0 :(得分:2)

首先处理最后一部分,返回类型不是方法签名的一部分,因此getChargesList()没有参数,方面正确实现了这一点。它的返回类型不会在第二个例子中受到约束,但这并不重要。

至于为什么setChargesList(T)没有实施,那是因为&#39; T&#39;未定义。当接口方法签名使用方法级泛型类型定义时,该定义也必须存在于实现中。所以这是有效的:

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

但这不是:

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

它是AspectJ正在生成的第二个例子

我担心我的AspectJ不足以告诉你如何解决你的问题,但我希望这可以帮助你弄清楚发生了什么。