/** * @see * com.intellij.psi.util.TypeConversionUtil#typeParameterErasure(com.intellij.psi.PsiTypeParameter) */ @Nullable private static JavaType typeParameterErasure( @NotNull JavaTypeParameter typeParameter, @NotNull HashSet<JavaTypeParameter> visited, @NotNull JavaTypeSubstitutor substitutor) { Collection<JavaClassifierType> upperBounds = typeParameter.getUpperBounds(); if (!upperBounds.isEmpty()) { JavaClassifier classifier = upperBounds.iterator().next().getClassifier(); if (classifier instanceof JavaTypeParameter && !visited.contains(classifier)) { JavaTypeParameter typeParameterBound = (JavaTypeParameter) classifier; visited.add(typeParameterBound); JavaType substitutedType = substitutor.substitute(typeParameterBound); if (substitutedType != null) { return erasure(substitutedType); } return typeParameterErasure(typeParameterBound, visited, substitutor); } else if (classifier instanceof JavaClass) { return ((JavaClass) classifier).getDefaultType(); } } return typeParameter.getTypeProvider().createJavaLangObjectType(); }