diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java index 0bb10aa527a8..ab6e361dcce1 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/JavaIntroduceParameterMethodUsagesProcessor.java @@ -31,6 +31,7 @@ import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.FieldConflictsResolver; import com.intellij.refactoring.util.LambdaRefactoringUtil; @@ -216,7 +217,11 @@ public class JavaIntroduceParameterMethodUsagesProcessor implements IntroducePar final MethodJavaDocHelper javaDocHelper = new MethodJavaDocHelper(method); PsiElementFactory factory = JavaPsiFacade.getInstance(data.getProject()).getElementFactory(); - PsiParameter parameter = factory.createParameter(data.getParameterName(), data.getForcedType()); + final PsiClass superClass = data.getMethodToSearchFor().getContainingClass(); + final PsiClass containingClass = method.getContainingClass(); + final PsiSubstitutor substitutor = superClass != null && containingClass != null ? TypeConversionUtil.getSuperClassSubstitutor(superClass, containingClass, PsiSubstitutor.EMPTY) + : PsiSubstitutor.EMPTY; + PsiParameter parameter = factory.createParameter(data.getParameterName(), substitutor.substitute(data.getForcedType())); PsiUtil.setModifierProperty(parameter, PsiModifier.FINAL, data.isDeclareFinal()); final PsiParameterList parameterList = method.getParameterList(); diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterSubstituteTypeParamsInInheritor.java b/java/java-tests/testData/refactoring/introduceParameter/afterSubstituteTypeParamsInInheritor.java new file mode 100644 index 000000000000..0292e8493174 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/afterSubstituteTypeParamsInInheritor.java @@ -0,0 +1,7 @@ +class A { + void foo(final T anObject) { + } +} +class B extends A { + void foo(final String anObject) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameter/beforeSubstituteTypeParamsInInheritor.java b/java/java-tests/testData/refactoring/introduceParameter/beforeSubstituteTypeParamsInInheritor.java new file mode 100644 index 000000000000..521d1e0bba70 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameter/beforeSubstituteTypeParamsInInheritor.java @@ -0,0 +1,8 @@ +class A { + void foo() { + T t = null; + } +} +class B extends A { + void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java index 6c0b19f5503c..f4940c975f38 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterTest.java @@ -302,6 +302,10 @@ public class IntroduceParameterTest extends LightRefactoringTestCase { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); } + public void testSubstituteTypeParamsInInheritor() { + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, false); + } + public void testDelegateWithVarargs() { doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_ALL, true, false, true, true); }