From 448079796f8a7ef5a4e6de91f40552cfaa184b81 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Fri, 10 Jun 2016 16:43:38 -0600 Subject: [PATCH] 8037804: Implement specified test for related functional interface types Reviewed-by: vromero --- .../com/sun/tools/javac/comp/Resolve.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java index 176f94dd29f..38ab1d7cd7f 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -1149,8 +1149,28 @@ public class Resolve { private boolean unrelatedFunctionalInterfaces(Type t, Type s) { return types.isFunctionalInterface(t.tsym) && types.isFunctionalInterface(s.tsym) && - types.asSuper(t, s.tsym) == null && - types.asSuper(s, t.tsym) == null; + unrelatedInterfaces(t, s); + } + + /** Whether {@code t} and {@code s} are unrelated interface types; recurs on intersections. **/ + private boolean unrelatedInterfaces(Type t, Type s) { + if (t.isCompound()) { + for (Type ti : types.interfaces(t)) { + if (!unrelatedInterfaces(ti, s)) { + return false; + } + } + return true; + } else if (s.isCompound()) { + for (Type si : types.interfaces(s)) { + if (!unrelatedInterfaces(t, si)) { + return false; + } + } + return true; + } else { + return types.asSuper(t, s.tsym) == null && types.asSuper(s, t.tsym) == null; + } } /** Parameters {@code t} and {@code s} are unrelated functional interface types. */