class SampleClass<VWXZ> {
private String sampleField;
- public Class<?> setSampleField(Class<?> clazz,
+ public Class<?> setSampleField(Class<?> clazz,
+ Class<? extends List> list, Class<? super Map> map,
List<String> listString, Map<Integer,String> mapString,
Generic<Integer,String,Double,Short,Float> test,
String sampleField, int one, short two, double three, Object obj) {
int semicolon = signature.indexOf(';', idx);
// TODO: Fix for Groovy's model-checking
// Check if this is a generic!
- int genericStart = signature.substring(idx,semicolon).indexOf('<');
+ String currParam = signature.substring(idx,semicolon);
+ int genericStart = currParam.indexOf('<');
if (genericStart != -1) {
- if (signature.charAt(genericStart + 2) == '*') {
+ if (currParam.charAt(genericStart + 1) == '*') {
semicolon = genericStart + 4;
} else {
int generic = signature.indexOf('>', semicolon);
}
public static boolean isWildcardType(String signature) {
- return (signature.startsWith("+L") || signature.equals("*"));
+ return (signature.startsWith("+L") || signature.startsWith("-L") || signature.equals("*"));
}
public static String getWildcardType(String signature) {
if (signature.equals("*")) {
return "java.lang.Object";
}
- return signature.replace("+L", "");
+ return signature.replaceAll("\\+L|-L", "");
}
// TODO: Fix for Groovy's model-checking
}
Types.isTypeParameter(parameterizedTypes[j], classGenericSig)) {
types[j] = getTypeVariableImplObject(env, objRef, parameterizedTypes[j]);
} else if (Types.isWildcardType(parameterizedTypes[j])) {
- String wildcardType = Types.getWildcardType(parameterizedTypes[j]);
- types[j] = getWildcardTypeImplObject(env, objRef, wildcardType);
+ types[j] = getWildcardTypeImplObject(env, objRef, parameterizedTypes[j]);
} else {
ClassInfo pci = cli.getResolvedClassInfo(parameterizedTypes[j]);
if (!pci.isRegistered()) {
int wildcardRef = env.newObject(ci);
ElementInfo ei = env.getModifiableElementInfo(wildcardRef);
- int uRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1);
- ClassInfo uci = cli.getResolvedClassInfo(wildcardType);
+ String actualType = Types.getWildcardType(wildcardType);
+ ClassInfo uci = cli.getResolvedClassInfo(actualType);
if (!uci.isRegistered()) {
uci.registerClass(ti);
}
- env.setReferenceArrayElement(uRef, 0, uci.getClassObjectRef());
+ int uRef = MJIEnv.NULL;
+ int lRef = MJIEnv.NULL;
+ if (wildcardType.startsWith("+L") || wildcardType.equals("*")) {
+ // Set upperBounds
+ uRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1);
+ env.setReferenceArrayElement(uRef, 0, uci.getClassObjectRef());
+ lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 0);
+ } else { // wildcardType.startsWith("-L")
+ // Set lowerBounds
+ lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1);
+ env.setReferenceArrayElement(lRef, 0, uci.getClassObjectRef());
+ }
ei.setReferenceField("upperBounds", uRef);
- int lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 0);
ei.setReferenceField("lowerBounds", lRef);
return wildcardRef;