inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { result &= false; } else {
@Override public void visitReference(JCMemberReference tree) { Type desc_t = types.findDescriptorType(t); Type desc_s = types.findDescriptorType(s); // use inference variables here for more-specific inference (18.5.4) if (!types.isSameTypes(desc_t.getParameterTypes(), inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { result &= false; } else { // compare return types Type ret_t = desc_t.getReturnType(); Type ret_s = desc_s.getReturnType(); if (ret_s.hasTag(VOID)) { result &= true; } else if (ret_t.hasTag(VOID)) { result &= false; } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { boolean retValIsPrimitive = tree.refPolyKind == PolyKind.STANDALONE && tree.sym.type.getReturnType().isPrimitive(); result &= (retValIsPrimitive == ret_t.isPrimitive()) && (retValIsPrimitive != ret_s.isPrimitive()); } else { result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); } } }
@Override public void visitLambda(JCLambda tree) { if (types.isFunctionalInterface(t.tsym) && types.isFunctionalInterface(s.tsym)) { Type desc_t = types.findDescriptorType(t); Type desc_s = types.findDescriptorType(s); if (types.isSameTypes(desc_t.getParameterTypes(), inferenceContext().asFree(desc_s.getParameterTypes()))) { if (types.asSuper(t, s.tsym) != null || types.asSuper(s, t.tsym) != null) { result &= MostSpecificCheckContext.super.compatible(t, s, warn); } else if (!desc_s.getReturnType().hasTag(VOID)) { //perform structural comparison Type ret_t = desc_t.getReturnType(); Type ret_s = desc_s.getReturnType(); scanLambdaBody(tree, ret_t, ret_s); } else { return; } } } else { result &= false; } } //where
@Override public void visitReference(JCMemberReference tree) { if (types.isFunctionalInterface(t.tsym) && types.isFunctionalInterface(s.tsym)) { Type desc_t = types.findDescriptorType(t); Type desc_s = types.findDescriptorType(s); if (types.isSameTypes(desc_t.getParameterTypes(), inferenceContext().asFree(desc_s.getParameterTypes()))) { if (types.asSuper(t, s.tsym) != null || types.asSuper(s, t.tsym) != null) { result &= MostSpecificCheckContext.super.compatible(t, s, warn); } else if (!desc_s.getReturnType().hasTag(VOID)) { //perform structural comparison Type ret_t = desc_t.getReturnType(); Type ret_s = desc_s.getReturnType(); result &= ((tree.refPolyKind == PolyKind.STANDALONE) ? standaloneMostSpecific(ret_t, ret_s, tree.sym.type.getReturnType(), warn) : polyMostSpecific(ret_t, ret_s, warn)); } else { return; } } } else { result &= false; } }