diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java
index 5730be7ac359..32f8805df501 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java
@@ -761,7 +761,7 @@ public class RedundantCastUtil {
PsiType castType = typeElement.getType();
if (castType instanceof PsiPrimitiveType) {
if (opType instanceof PsiPrimitiveType) {
- return !opType.equals(castType); // let's suppose all not equal primitive casts are necessary
+ return !TypeConversionUtil.isSafeConversion(castType, opType); // let's suppose that casts losing precision are important
}
final PsiPrimitiveType unboxedOpType = PsiPrimitiveType.getUnboxedType(opType);
if (unboxedOpType != null && !unboxedOpType.equals(castType) ) {
diff --git a/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java b/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java
new file mode 100644
index 000000000000..4b0f5802aa1d
--- /dev/null
+++ b/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java
@@ -0,0 +1,18 @@
+import org.jetbrains.annotations.*;
+
+class A {
+ double widen(int x) {
+ return (double) x;
+ }
+
+ double widenDataLoss(long x) {
+ return (double) x;
+ }
+
+ void call(short a, byte b, long c) {
+ widen((int)a);
+ widen((int)b);
+ widen((int)c);
+ }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java
new file mode 100644
index 000000000000..c81ef21aff32
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java
@@ -0,0 +1,12 @@
+class UnnecessaryDoubleCast {
+ public void check() {
+ eq(25, 25.49);
+ }
+
+ private static void eq(double expected, double actual) {
+ assertDoubleEquals(expected, actual);
+ }
+
+ public static void assertDoubleEquals(double v, double v2) {
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after
new file mode 100644
index 000000000000..7aa50597248d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after
@@ -0,0 +1,8 @@
+class UnnecessaryDoubleCast {
+ public void check() {
+ assertDoubleEquals(25, 25.49);
+ }
+
+ public static void assertDoubleEquals(double v, double v2) {
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java
index 7383056065da..945b74b6aba7 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java
@@ -78,4 +78,6 @@ public class RedundantCast15Test extends LightCodeInsightFixtureTestCase {
myFixture.testHighlighting(getTestName(false) + ".java");
}
public void testDifferentNullness() { doTest();}
+
+ public void testPrimitiveWidening() { doTest(); }
}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java
index 163f0ce19e3e..c2c2fc456b9b 100644
--- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java
@@ -422,6 +422,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
public void testPrivateFieldInSuperClassInSameFile() {
doTest();
}
+
+ public void testWidenArgument() {
+ doTest();
+ }
public void testInlineMultipleOccurrencesInFieldInitializer() {
doTest();