/** BoundR and unbound constraints. */
interface UnboundR {
void consume(/*1*/ UnboundR this, /*2*/ MyClass my, String s);
}
interface BoundR {
void consume(/*4*/ BoundR this, String s);
}
interface SupplierR<R> {
R supply();
}
class MyClass {
void take(/*6*/ MyClass this, String s) {}
void context(/*7*/ MyClass my) {
/*8*/ UnboundR u1 = /*9*/ MyClass::take;
// 2 <: 6 -- like an override
// No relation to 1 or 2
// No relationship or check for 8 / 9?
// Need to check on this.
u1.consume(my, "");
// 7 <: 2
// 8 <: 1
/*10*/ BoundR b1 = /*11*/ my::take;
// 7 <: 6 -- like an invocation
// No Relationship for 10 / 11?
b1.consume("");
// 10 <: 4
}
}
/** Constraints for implicit inner constraints and super */
@SuppressWarnings("lock")
class OuterR {
class Inner {
Inner(/*1*/ OuterR OuterR.this) {}
void context() {
SupplierR<String> o = OuterR.super::toString;
}
}
void context(/*2*/ OuterR this) {
// This one is unbound and needs an OuterR as a param
SupplierR</*3*/ Inner> f = /*4*/ Inner::new;
}
}