void (@NotNull PsiTypeCastExpression expression) { super.visitTypeCastExpression(expression); final PsiExpression operand = expression.getOperand(); if (operand == null) { return; } final PsiType operandType = operand.getType(); if (operandType == null) { return; } final PsiType type = expression.getType(); if (type == null) { return; } final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, true); if (expectedType == null || expectedType.equals(type)) { return; } final PsiClass resolved = PsiUtil.resolveClassInType(expectedType); if (resolved != null && !resolved.isPhysical()) { return; } if (expectedType.isAssignableFrom(operandType) && !MethodCallUtils.isNecessaryForSurroundingMethodCall(expression, operand)) { //then it's redundant, and caught by the "Redundant type cast" inspection return; } if (TypeUtils.isTypeParameter(expectedType)) { return; } if (expectedType instanceof PsiArrayType arrayType) { final PsiType componentType = arrayType.getDeepComponentType(); if (TypeUtils.isTypeParameter(componentType)) { return; } } if (type instanceof PsiPrimitiveType || expectedType instanceof PsiPrimitiveType) { return; } if (PsiPrimitiveType.getUnboxedType(type) != null || PsiPrimitiveType.getUnboxedType(expectedType) != null) { return; } if (expectedType instanceof PsiClassType expectedClassType) { final PsiClassType expectedRawType = expectedClassType.rawType(); if (type.equals(expectedRawType)) { return; } if (type instanceof PsiClassType classType) { final PsiClassType rawType = classType.rawType(); if (rawType.equals(expectedRawType)) { return; } } if (type instanceof PsiArrayType) { return; } } if (ignoreInMatchingInstanceof && InstanceOfUtils.hasAgreeingInstanceof(expression)) { return; } final PsiTypeElement castTypeElement = expression.getCastType(); if (castTypeElement == null) { return; } if (operand instanceof PsiFunctionalExpression) { if (!LambdaUtil.isFunctionalType(expectedType)) { return; } PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(expectedType); if (interfaceReturnType instanceof PsiPrimitiveType || PsiPrimitiveType.getUnboxedType(interfaceReturnType) != null) { return; } } registerError(castTypeElement, expectedType); }