[java-highlighting] IDEA-324773 Generics invalid cast error is not displayed when nested parameters are different

GitOrigin-RevId: baf9b93808e3420e47f716ab2ef438e24fb14b7d
This commit is contained in:
Mikhail Pyltsin
2023-09-14 10:01:33 +00:00
committed by intellij-monorepo-bot
parent d94747559e
commit 5604ca130c
3 changed files with 94 additions and 1 deletions
@@ -157,12 +157,17 @@ public final class TypesDistinctProver {
if (rejectInconsistentRaw && level > 0 &&
extendsBound1 instanceof PsiClassType && extendsBound2 instanceof PsiClassType &&
(((PsiClassType)extendsBound1).isRaw() ^ ((PsiClassType)extendsBound2).isRaw())) return true;
if (type1.equals(type2)) return false;
if (level > 1) return true;
return proveExtendsBoundsDistinct(type1, type2, boundClass1, boundClass2);
}
return provablyDistinct(extendsBound1, extendsBound2, 1);
}
if (type2.isExtends()) return provablyDistinct(type2, type1, rejectInconsistentRaw, level);
if (type1.isExtends() && !type2.isBounded() && level > 1) return PsiUtil.resolveClassInType(type1.getExtendsBound()) instanceof PsiTypeParameter;
if (type1.isExtends() && !type2.isBounded() && level > 1) {
PsiType bound = type1.getExtendsBound();
return bound instanceof PsiClassType || bound instanceof PsiArrayType;
}
if (type1.isExtends() && type2.isSuper()) {
final PsiType extendsBound = type1.getExtendsBound();
final PsiType superBound = type2.getSuperBound();
@@ -0,0 +1,86 @@
import java.util.Set;
@SuppressWarnings("unused")
public class InvalidCast {
public static void main(String[] args) {
}
static class X1 {
}
static class X2 extends X1 {
}
public void t1(Set<Set<X1>> t) {
Set<Set<X1>> t2 = (Set<Set<X1>>) t;
}
public void t2(Set<Set<X2>> t) {
Set<Set<X2>> t2 = (Set<Set<X2>>) t;
}
public void t3(Set<Set<X1>> t) {
Set<Set<X2>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<InvalidCast.X1>>' to 'java.util.Set<java.util.Set<InvalidCast.X2>>'">(Set<Set<X2>>) t</error>; //error
}
public void t4(Set<Set<X2>> t) {
Set<Set<X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<InvalidCast.X2>>' to 'java.util.Set<java.util.Set<InvalidCast.X1>>'">(Set<Set<X1>>) t</error>; //error
}
public void t5(Set<Set<? extends X1>> t) {
Set<Set<? extends X2>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X2>>'">(Set<Set<? extends X2>>) t</error>; //error
}
public void t6(Set<Set<? extends X2>> t) {
Set<Set<? extends X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X2>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>'">(Set<Set<? extends X1>>) t</error>; //error
}
public void t7(Set<Set<? extends X1>> t) {
Set<Set<? extends X1>> t2 = (Set<Set<? extends X1>>) t;
}
public void t8(Set<Set<? extends X2>> t) {
Set<Set<? extends X2>> t2 = (Set<Set<? extends X2>>) t;
}
public void t9(Set<Set<X1>> t) {
Set<Set<? extends X2>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<InvalidCast.X1>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X2>>'">(Set<Set<? extends X2>>) t</error>; //error
}
public void t10(Set<Set<X2>> t) {
Set<Set<? extends X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<InvalidCast.X2>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>'">(Set<Set<? extends X1>>) t</error>; //error
}
public void t11(Set<Set<? extends X1>> t) {
Set<Set<X2>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>' to 'java.util.Set<java.util.Set<InvalidCast.X2>>'">(Set<Set<X2>>) t</error>; //error
}
public void t12(Set<Set<? extends X2>> t) {
Set<Set<X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X2>>' to 'java.util.Set<java.util.Set<InvalidCast.X1>>'">(Set<Set<X1>>) t</error>; //error
}
public void t13(Set<Set<? extends X1>> t) {
Set<Set<X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>' to 'java.util.Set<java.util.Set<InvalidCast.X1>>'">(Set<Set<X1>>) t</error>; //error
}
public void t14(Set<Set<X1>> t) {
Set<Set<? extends X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<InvalidCast.X1>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>'">(Set<Set<? extends X1>>) t</error>; //error
}
public void t15(Set<Set<?>> t) {
Set<Set<? extends X1>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<?>>' to 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>'">(Set<Set<? extends X1>>) t</error>; // error
}
public void t16(Set<Set<? extends X1>> t) {
Set<Set<?>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends InvalidCast.X1>>' to 'java.util.Set<java.util.Set<?>>'">(Set<Set<?>>) t</error>; // error
}
public void t17(Set<Set<?>> t) {
Set<Set<?>> t2 = (Set<Set<?>>) t;
}
public void t18(Set<Set<? extends int[]>> t) {
Set<Set<?>> t2 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Set<? extends int[]>>' to 'java.util.Set<java.util.Set<?>>'">(Set<Set<?>>) t</error>; // error
}
}
@@ -455,4 +455,6 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testOnlyUncheckedWarningCastWithDuplicatedArguments(){doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, true);}
public void testCastUnboxingConversionWithWidening(){doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, true);}
public void testVarCaptureForLoop(){doTest(LanguageLevel.JDK_10, JavaSdkVersion.JDK_10, true);}
public void testInvalidCastWithNestedGeneric(){doTest(LanguageLevel.JDK_1_8, JavaSdkVersion.JDK_1_8, true);}
}