[ http://issues.apache.org/jira/browse/IBATIS-128?page=comments#action_12460084 ] Tor Tuga commented on IBATIS-128: ---------------------------------
I am using Java Generics and this warning gets thrown when I override an abstract method in a base class with my concrete class. Reflection shows the following information for getId() and setId() where RealBaseEntity is the class that extends the abstract class BaseEntity: RealBaseEntity.getDeclaredMethods() public final void com.test.RealBaseEntity.setId(java.lang.Short) public final java.lang.Short com.test.RealBaseEntity.getId() public volatile void com.test.RealBaseEntity.setId(java.io.Serializable) public volatile java.io.Serializable com.test.RealBaseEntity.getId() RealBaseEntity.getSuperclass().getDeclaredMethods() public abstract void com.test.BaseEntity.setId(java.io.Serializable) public abstract java.io.Serializable com.test.BaseEntity.getId() Now, if I narrow my abstract definition in BaseEntity (elminating the use of Generics), the following occurs: RealBaseEntity.getDeclaredMethods() public final void com.test.BaseEntity.setId(java.lang.Short) public final java.lang.Short com.test.BaseEntity.getId() RealBaseEntity.getSuperclass().getDeclaredMethods() public abstract void com.test.BaseEntity.setId(java.lang.Short) public abstract java.lang.Short com.test.BaseEntity.getId() The reason that the 'java.lang.Serializable' appears is because my base entity uses generics in this way: public abstract class BaseEntity<PK extends Serializable> implements Serializable so at compile time, any <PK> is replaced by Serializable. However, RealBaseEntity is declared in this way: public class RealBaseEntity extends BaseEntity<Short> So I can't really understand why the compiler would bother to create volatile methods if the final overridden methods are specific enough. I'd be happy to attach the whole BaseEntity and RealBaseEntity classes if that would help understand what I mean. I've debugged com.ibatis.common.beans.ClassInfo and I can see that the volatile and final methods are conflicting causing the error to appear. Couldn't the volatile methods be ignored? Or, if a method is volatile, couldn't the superclass be checked for an abstract method with the same signature? This could be done in com.ibatis.common.beans.ClassInfo.addUniqueMethods(). Should I be using an interface instead of an abstract class? > Detect illegal overloaded JavaBeans properties methods (e.g. setters) > --------------------------------------------------------------------- > > Key: IBATIS-128 > URL: http://issues.apache.org/jira/browse/IBATIS-128 > Project: iBatis for Java > Issue Type: Improvement > Components: SQL Maps > Affects Versions: 2.0.8 > Environment: iBatis 2.0.7 > Reporter: Jerome Lacoste > Assigned To: Jeff Butler > Priority: Minor > Fix For: 2.2.0 > > > ClassInfo keys setters by their names. > private void addMethods(Class cls) { > Method[] methods = cls.getMethods(); > for (int i = 0; i < methods.length; i++) { > String name = methods[i].getName(); > if (name.startsWith("set") && name.length() > 3) { > if (methods[i].getParameterTypes().length == 1) { > name = dropCase(name); > --> setMethods.put(name, methods[i]); > setTypes.put(name, methods[i].getParameterTypes()[0]); > } > See > http://cvs.sourceforge.net/viewcvs.py/ibatisdb/ibatis-dbl-2/src/com/ibatis/common/beans/ClassInfo.java?rev=1.8&view=markup > So if you overload a method in your bean, you never know which one is going > to be stored last in the map. > With: > public void setFeatureIDs(Set featureIDs) { > this.featureIDs = featureIDs; > } > public void setFeatureIDs(List featureIDs) { > this.featureIDs = new TreeSet(featureIDs); > } > I end up with the following error: > Error setting property 'setFeatureIDs(java.util.Set=[2] $Proxy4 implements > interface java.util.List)' of 'Part-20021'. Cause: > java.lang.IllegalArgumentException: argument type mismatch Caused by: > java.lang.IllegalArgumentException: argument type mismatch]; > See issue IBATIS-127 for debugging -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira