--- 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<Type> 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() ||