return selfType;
else {
if (type.isArray()) {
return substituteSpecialType(type.elementType(), selfType, resultType, exceptionType).array();
} else if (type instanceof JTypeWildcard) {
JTypeWildcard wildcard = (JTypeWildcard)type;
AbstractJClass bound = substituteSpecialType(wildcard.bound(), selfType, resultType, exceptionType);
return bound.wildcard(wildcard.boundMode());
} else {
List<AbstractJClass> typeArguments = new ArrayList<AbstractJClass>();
for (AbstractJClass originalArgument: type.getTypeParameters()) {
typeArguments.add(substituteSpecialType(originalArgument, selfType, resultType, exceptionType));
}