boolean (PsiType lType, PsiType rType) { if (lType instanceof PsiPrimitiveType || rType instanceof PsiPrimitiveType) return false; if (lType.equals(rType)) return false; if (lType instanceof PsiArrayType && rType instanceof PsiArrayType) { return isRawToGeneric(((PsiArrayType)lType).getComponentType(), ((PsiArrayType)rType).getComponentType()); } if (lType instanceof PsiArrayType || rType instanceof PsiArrayType) return false; if (rType instanceof PsiIntersectionType) { for (PsiType type : ((PsiIntersectionType)rType).getConjuncts()) { if (isRawToGeneric(lType, type)) return true; } return false; } if (lType instanceof PsiIntersectionType) { for (PsiType type : ((PsiIntersectionType)lType).getConjuncts()) { if (isRawToGeneric(type, rType)) return true; } return false; } if (rType instanceof PsiCapturedWildcardType) { return isRawToGeneric(lType, ((PsiCapturedWildcardType)rType).getUpperBound()); } if (!(lType instanceof PsiClassType) || !(rType instanceof PsiClassType)) return false; PsiClassType.ClassResolveResult lResolveResult = ((PsiClassType)lType).resolveGenerics(); PsiClassType.ClassResolveResult rResolveResult = ((PsiClassType)rType).resolveGenerics(); PsiClass lClass = lResolveResult.getElement(); PsiClass rClass = rResolveResult.getElement(); if (rClass instanceof PsiAnonymousClass) { return isRawToGeneric(lType, ((PsiAnonymousClass)rClass).getBaseClassType()); } PsiSubstitutor lSubstitutor = lResolveResult.getSubstitutor(); PsiSubstitutor rSubstitutor = rResolveResult.getSubstitutor(); if (lClass == null || rClass == null) return false; if (lClass instanceof PsiTypeParameter && !InheritanceUtil.isInheritorOrSelf(rClass, lClass, true)) { return true; } if (!lClass.getManager().areElementsEquivalent(lClass, rClass)) { if (lClass.isInheritor(rClass, true)) { lSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(rClass, lClass, lSubstitutor); lClass = rClass; } else if (rClass.isInheritor(lClass, true)) { rSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(lClass, rClass, rSubstitutor); rClass = lClass; } else { return false; } } Iterator<PsiTypeParameter> lIterator = PsiUtil.typeParametersIterator(lClass); Iterator<PsiTypeParameter> rIterator = PsiUtil.typeParametersIterator(rClass); while (lIterator.hasNext()) { if (!rIterator.hasNext()) return false; PsiTypeParameter lParameter = lIterator.next(); PsiTypeParameter rParameter = rIterator.next(); PsiType lTypeArg = lSubstitutor.substitute(lParameter); PsiType rTypeArg = rSubstitutor.substituteWithBoundsPromotion(rParameter); if (lTypeArg == null) continue; if (rTypeArg == null) { if (lTypeArg instanceof PsiWildcardType && ((PsiWildcardType)lTypeArg).getBound() == null) { continue; } else { return true; } } if (!TypeConversionUtil.typesAgree(lTypeArg, rTypeArg, true)) return true; } return false; }