lambda: incompatible lambda parameters type check fixed according to wildcards (IDEA-99073)

This commit is contained in:
anna
2013-01-16 14:08:52 +01:00
parent 92592d68f4
commit 4cbc38008a
4 changed files with 17 additions and 3 deletions

View File

@@ -269,7 +269,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
for (int i = 0; i < lambdaParameters.length; i++) {
PsiParameter lambdaParameter = lambdaParameters[i];
if (!TypeConversionUtil.isAssignable(LambdaUtil.getSubstitutor(interfaceMethod, resolveResult).substitute(parameters[i].getType()), lambdaParameter.getType())) {
if (!TypeConversionUtil.isAssignable(lambdaParameter.getType(),
GenericsUtil.eliminateWildcards(LambdaUtil.getSubstitutor(interfaceMethod, resolveResult).substitute(parameters[i].getType())))) {
myHolder.add(HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, lambdaParameter, incompatibleTypesMessage));
break;
}

View File

@@ -0,0 +1,9 @@
class Test {
public interface I<K, V> {
public V put(K k);
}
{
final I<? super Long, CharSequence> i = (Number n) -> n.toString();
}
}

View File

@@ -1,7 +1,7 @@
class Test {
{
<error descr="Incompatible types. Found: '<lambda expression>', required: 'java.lang.Comparable'">Comparable c = (String o)->{
Comparable c = (<error descr="Incompatible parameter types in lambda expression">String o</error>)->{
return 0;
};</error>
};
}
}

View File

@@ -41,6 +41,10 @@ public class LambdaParamsTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testFormalParamsWithWildcards() throws Exception {
doTest();
}
private void doTest() throws Exception {
doTest(BASE_PATH + "/" + getTestName(false) + ".java", false, false);
}