diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WideningCastToTypeParam.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WideningCastToTypeParam.java index 78f5f589beed..7615d72908e3 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WideningCastToTypeParam.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WideningCastToTypeParam.java @@ -31,3 +31,21 @@ public class Test { IConverter converter2 = getConverter2(String.class); } } + + +class Z { + +} + +class TestNonNarrowingConversion { + public TestNonNarrowingConversion(T u) { + + } + + public T z = null; + + public int a() { + TestNonNarrowingConversion x = new TestNonNarrowingConversion(new Z()); + return 1; + } +} diff --git a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java index c5cd6ca8aedd..22991fddf6ed 100644 --- a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java @@ -207,7 +207,7 @@ public class TypeConversionUtil { final LanguageLevel languageLevel = toClassType.getLanguageLevel(); if (!fromClass.isInterface()) { if (toClass.isInterface()) { - return !fromClass.hasModifierProperty(PsiModifier.FINAL) && + return (!fromClass.hasModifierProperty(PsiModifier.FINAL) || fromClass.isInheritor(toClass, true))&& checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager, fromResult.getSubstitutor(), null, languageLevel); } else { @@ -337,6 +337,13 @@ public class TypeConversionUtil { PsiType typeArg2 = substitutor2.substitute(typeParameter); if (typeArg1 == null || typeArg2 == null) return true; if (TypesDistinctProver.provablyDistinct(typeArg1, typeArg2)) return false; + + final PsiClass class1 = PsiUtil.resolveClassInType(typeArg1); + if (class1 instanceof PsiTypeParameter) { + for (PsiType type : class1.getExtendsListTypes()) { + if (TypesDistinctProver.provablyDistinct(type, typeArg2)) return false; + } + } } return true; @@ -867,14 +874,6 @@ public class TypeConversionUtil { } } else { - final PsiClass leftClass = PsiUtil.resolveClassInType(typeLeft); - if (leftClass instanceof PsiTypeParameter) { - for (PsiClassType leftClassType : leftClass.getExtendsListTypes()) { - if (TypesDistinctProver.provablyDistinct(leftClassType, typeRight)) return false; - } - if (!(typeRight instanceof PsiCapturedWildcardType || typeRight instanceof PsiWildcardType)) return true; - } - return typeLeft.equals(typeRight); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java index f8e017188178..a2865e72fb02 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/processors/MethodResolverProcessor.java @@ -408,8 +408,8 @@ public class MethodResolverProcessor extends ResolverProcessor { if (argTypes != null && argTypes.length > i) { PsiType argType = argTypes[i]; if (argType != null) { - final boolean converts1 = TypesUtil.isAssignable(type1, argType, manager, scope, false); - final boolean converts2 = TypesUtil.isAssignable(type2, argType, manager, scope, false); + final boolean converts1 = TypesUtil.isAssignable(TypeConversionUtil.erasure(type1), argType, manager, scope, false); + final boolean converts2 = TypesUtil.isAssignable(TypeConversionUtil.erasure(type2), argType, manager, scope, false); if (converts1 != converts2) { return converts2; }