Type variable substitution in method return type
Issue #129
new
extendj v8.0.1-4-gcc1f6e3 I tried to compile jEdit5.2.0 using extendj. While javac accept it, extendj find an error in org/gjt/sp/jedit/pluginmgr/Roster.java. Here is a minimal example :
class A{} interface I0<X>{ X get(); } interface I { I0<? extends A> m(); } class B{ void mtest(I i){ I0<? extends A> i0 = i.m(); A a = i0.get(); } }
Extendj complains that it can not assign a value of type X to a variable of type A. I fixed it by modifying TypeVariable.substituteReturnType in java5/frontend/Generics.jrag :
public Access TypeVariable.substituteReturnType(Parameterization parTypeDecl) { if (parTypeDecl.isRawType()) { return erasure().createBoundAccess(); } TypeDecl typeDecl = parTypeDecl.substitute(this); if (typeDecl instanceof WildcardType) { return createBoundAccess(); } else if (typeDecl instanceof WildcardExtendsType) { // if (typeDecl.instanceOf(this)) { return ((WildcardExtendsType) typeDecl).extendsType().createBoundAccess(); // } else { // return createBoundAccess(); // } } else if (typeDecl instanceof WildcardSuperType) { return createBoundAccess(); } return typeDecl.createBoundAccess(); }
The minimal example seems to compile fine with
ExtendJ 8.0.1-16-g930e00d Java SE 8
. I will try to compile jEdit 5.2.0 and see if I can reproduce the error in that code base.