boolean (PsiType type1, PsiType type2) { if (TypeConversionUtil.areTypesConvertible(type1, type2)) { return true; } final PsiType comparedTypeErasure = TypeConversionUtil.erasure(type1); final PsiType comparisonTypeErasure = TypeConversionUtil.erasure(type2); if (comparedTypeErasure == null || comparisonTypeErasure == null || TypeConversionUtil.areTypesConvertible(comparedTypeErasure, comparisonTypeErasure)) { if (type1 instanceof PsiClassType classType1 && type2 instanceof PsiClassType classType2) { final PsiType[] parameters1 = classType1.getParameters(); final PsiType[] parameters2 = classType2.getParameters(); if (parameters1.length != parameters2.length) { return ((PsiClassType)type1).isRaw() || ((PsiClassType)type2).isRaw(); } for (int i = 0; i < parameters1.length; i++) { if (!areConvertible(parameters1[i], parameters2[i])) { return false; } } } return true; } return false; }