src/share/classes/com/sun/tools/javac/comp/Resolve.java

changeset 2387
cf626fb754aa
parent 2384
327122b01a9e
child 2392
73cbce40a149
equal deleted inserted replaced
2386:f8e84de96252 2387:cf626fb754aa
1522 } 1522 }
1523 if (m1SignatureMoreSpecific) return m1; 1523 if (m1SignatureMoreSpecific) return m1;
1524 if (m2SignatureMoreSpecific) return m2; 1524 if (m2SignatureMoreSpecific) return m2;
1525 return ambiguityError(m1, m2); 1525 return ambiguityError(m1, m2);
1526 case AMBIGUOUS: 1526 case AMBIGUOUS:
1527 //check if m1 is more specific than all ambiguous methods in m2 1527 //compare m1 to ambiguous methods in m2
1528 AmbiguityError e = (AmbiguityError)m2.baseSymbol(); 1528 AmbiguityError e = (AmbiguityError)m2.baseSymbol();
1529 boolean m1MoreSpecificThanAnyAmbiguous = true;
1530 boolean allAmbiguousMoreSpecificThanM1 = true;
1529 for (Symbol s : e.ambiguousSyms) { 1531 for (Symbol s : e.ambiguousSyms) {
1530 if (mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs) != m1) { 1532 Symbol moreSpecific = mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs);
1531 return e.addAmbiguousSymbol(m1); 1533 m1MoreSpecificThanAnyAmbiguous &= moreSpecific == m1;
1532 } 1534 allAmbiguousMoreSpecificThanM1 &= moreSpecific == s;
1533 } 1535 }
1534 return m1; 1536 if (m1MoreSpecificThanAnyAmbiguous)
1537 return m1;
1538 //if m1 is more specific than some ambiguous methods, but other ambiguous methods are
1539 //more specific than m1, add it as a new ambiguous method:
1540 if (!allAmbiguousMoreSpecificThanM1)
1541 e.addAmbiguousSymbol(m1);
1542 return e;
1535 default: 1543 default:
1536 throw new AssertionError(); 1544 throw new AssertionError();
1537 } 1545 }
1538 } 1546 }
1539 //where 1547 //where

mercurial