PsiSubstitutor (@NotNull PsiClass from, @NotNull final PsiClass to, @NotNull PsiSubstitutor substitutor) { Iterator<PsiTypeParameter> baseParams = PsiUtil.typeParametersIterator(to); Iterator<PsiTypeParameter> candidateParams = PsiUtil.typeParametersIterator(from); PsiSubstitutor answer = PsiSubstitutor.EMPTY; while (baseParams.hasNext()) { // if equivalent classes "from" and "to" have different number of type parameters, then treat "to" as a raw type if (!candidateParams.hasNext()) return JavaClassSupersImpl.createRawSubstitutor(to); answer = answer.put(baseParams.next(), substitutor.substitute(candidateParams.next())); } return answer; }