Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] problem with inter-type declaration - inserting a method override

Problem: I want to statically add a toString method into a specified set of
classes but
I'm having a problem with the ajc 1.2.1 compiler in the case where the
baseclass already
defines a toString method.  It says there is a conflict with an existing
member.
I've created a simplified test case below to concretely illustrate the
problem.

So is this some kind of correct limitation in the aspectj language that I've
missed?  It seems like this is a natural way of injecting method overrides
for
any superclass method implementation(s)...

Thanks for any help.

=========== ajc 1.2.1 compiler messages  ==================

     [iajc] Extending interface set for type 'SubclassData'
(SubclassData.java) to include 'ToStringInjector$IToString'
(ToStringInjector.aj)
     [iajc] 	
     [iajc]
C:\Projects\AspectJ\ToStringInjectorBug\src\ToStringInjector.aj:8 [error]
inter-type declaration from ToStringInjector conflicts with existing member:
java.lang.String BaseClass.toString()
     [iajc] public String IToString.toString() {
     [iajc]                         ^^^^^
     [iajc] MessageHolder:  (1 weaveinfo)  (1 error) 
     [iajc] [error   0]: error at public String IToString.toString() {
     [iajc]                         ^^^^^
     [iajc]
C:\Projects\AspectJ\ToStringInjectorBug\src\ToStringInjector.aj:8:0
inter-type declaration from ToStringInjector conflicts with existing member:
java.lang.String BaseClass.toString()

=========== ToStringInjector.aj ==================
aspect ToStringInjector {
    private interface IToString {};
    declare parents: (SubclassData) implements IToString;
    public String IToString.toString() {
	return "eliminated commons-lang dependency for testcase";
    }
};
=========== BaseClass.java ==================
public class BaseClass {
    public void foo() {}
    public String toString() {
	return "BaseClass";
    }
};
=========== SubclassData.java ==================
public class SubclassData extends BaseClass {
    public void bar() {}
};



Back to the top