2016-03-23 51 views
1


XSD tarafından oluşturulan beton sınıflarına arabirimler tanıtmak istiyorum. Önce çalışma versiyonu görmek gerekir:AspectJ ITD Genel Yöntem Parametre Kırıkları Derleme

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; 
} 

O sürüm çalışır ama yöntem bildirimleri için generic'leri taşırsanız öyle değil:

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; 
} 

hata iletisi: Booking.java:144 [error] The type Booking must implement the inherited abstract method IBooking.setChargesList(T)

İlginç kısım, getChargesList() yöntemi için hata vermez.

Bunun nedeni ne olabilir?

Kitap sınıfında ilgili kısmı aşağıdaki gibi olur:

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

Lütfen rezervasyon sınıfının kaynak kodunun ilgili kısmını, özellikle 'getChargesList()' ve 'setChargesList()' yöntemlerinin beyanını ekleyin. –

+0

@ NándorElődFekete Ekledim. – GokcenG

cevap

2

ilk son bölümü ile başa çıkmak, bir dönüş türü yöntem imzası bir parçası olduğundan ve bu yüzden getChargesList() herhangi bir parametre olarak, bir yönü değildir doğru uygular. İade türü ikinci örnekte bağlı olmayacaktır, ancak bu önemli değil.

Neden setChargesList(T) uygulanmadığı için, bunun nedeni 'T' undefined olmasıdır. Bir arabirim yöntemi imzası, yöntem düzeyinde genel bir tür tanımı kullandığında, uygulamada bu tanımın da bulunması gerekir.

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

Ama bu değildir: Yani bu geçerlidir

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

Ve AspectJ'yi benim AspectJ'yi anlatmak için yeterince iyi değil korkuyorum

getirici olduğunu onun ikinci örneği Hemen sorununuzu nasıl çözeceğinizi düşünüyorsunuz, ama umarım ki neler olduğunu anlamanıza yardımcı olur.