diff -r 3812717dc3e9 -r bbd692ad4fa3 src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Nov 21 16:54:46 2017 -0800 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Wed Nov 22 18:07:53 2017 +0530 @@ -2269,17 +2269,22 @@ /** * Erasure destroys the implementation parameter subtype - * relationship for intersection types + * relationship for intersection types. + * Have similar problems for union types too. */ - boolean interfaceParameterIsIntersectionType() { + boolean interfaceParameterIsIntersectionOrUnionType() { List tl = tree.getDescriptorType(types).getParameterTypes(); for (; tl.nonEmpty(); tl = tl.tail) { Type pt = tl.head; - if (pt.getKind() == TypeKind.TYPEVAR) { - TypeVar tv = (TypeVar) pt; - if (tv.bound.getKind() == TypeKind.INTERSECTION) { + switch (pt.getKind()) { + case INTERSECTION: + case UNION: return true; - } + case TYPEVAR: + TypeVar tv = (TypeVar) pt; + if (tv.bound.getKind() == TypeKind.INTERSECTION) { + return true; + } } } return false; @@ -2290,7 +2295,7 @@ * (i.e. var args need to be expanded or "super" is used) */ final boolean needsConversionToLambda() { - return interfaceParameterIsIntersectionType() || + return interfaceParameterIsIntersectionOrUnionType() || isSuper || needsVarArgsConversion() || isArrayOp() ||