<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Maurizio,<div><br></div><div>Looking on this, I'm wondering how important is this case: <span style="color:rgb(51,51,51);font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;background-color:rgb(248,248,248)">Quoted<Function<?, ?>> f = (Integer i) -> </span><span style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;color:rgb(221,17,68)">""</span><span style="color:rgb(51,51,51);font-family:Consolas,Inconsolata,Courier,monospace;font-size:11.05px;background-color:rgb(248,248,248)">;</span></div><div>The "practical" case is something like: <T, R> RETURN_TYPE method(Quoted<Function<T, R>> f).</div><div>Which should compile well because of inference.</div><div>And if someone insists on working with wildcards, so he has an option.</div><div><br></div><div>Kosta</div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 8, 2024 at 3:19 PM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com">maurizio.cimadamore@oracle.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>
<div>
<div>
<p style="margin:0px 0px 1.2em">On 06/05/2024 18:50,
Paul Sandoz wrote:</p>
<p style="margin:0px 0px 1.2em"></p>
<div>
<p></p>
<blockquote type="cite">
<pre><blockquote type="cite" style="color:rgb(140,140,140)"><pre>Just wanted to mention that there might be alternative implementations addressing this requirement.
1. Structural quoting (a la C#) - derives from the variable type, e.g. Quoted<T>. So, the user understands that the lambda body will be accessible.
</pre></blockquote><pre>There are some challenges with Java’s type system, which is why we embedded up where we are with the current approaches. Maurizio is better able than I to describe these challenges.</pre></pre>
</blockquote>
<p></p>
</div>
<p style="margin:0px 0px 1.2em"></p>
<p style="margin:0px 0px 1.2em">Hi,<br>
we have explored approaches such as <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Quoted<T></code>
(where <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">T</code>
is a functional interface) early on. And found them a bad fit
for Java. The main issue we faced is that being a functional
interface, as per today’s JLS, is a predicate on class
declarations not types (there was some intense discussion on
this point during Java 8). But here we have something that can
be treated as a functional interface or not, precisely depending
on its type (e.g. the type parameter). E.g. a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Quotable<T></code>
is a functional interface or not depending on <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">T</code>.
This is a pretty deep big departure from how the spec currently
deal with functional interfaces.</p>
<p style="margin:0px 0px 1.2em">One possibility would
be for the compiler/spec to ignore the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Quoted<T></code>,
and just focus on the inner <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">T</code>,
and then add the quoting back, after type-checking. But doing so
leads to (bad) edge cases. For instance, Java 8 supports a form
of inference of the target type from the explicit lambda
parameter types, in this case:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248);display:block">Function<?, ?> f = (Integer i) -> <span style="color:rgb(221,17,68)">""</span>;
</code></pre>
<p style="margin:0px 0px 1.2em">In this case, the
type of the lambda expression is not just <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Function<?, ?></code>
(the target type), but <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Function<Integer,Object></code>.
That is, the compiler tries to get rid of the wildcards before
attempting to type-check the lambda expression (this step is
performed to avoid wildcards popping up when checking the lambda
body). But with quoting, this won’t compose well - e.g.:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248);display:block">Quoted<Function<?, ?>> f = (Integer i) -> <span style="color:rgb(221,17,68)">""</span>;
</code></pre>
<p style="margin:0px 0px 1.2em">Will give an error:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">error: incompatible types: Quoted<Function<Integer, Object>> cannot be converted to Quoted<Function<?, ?>>
Quoted<Function<?, ?>> f = (Integer i) -> “”;
^
</code></pre>
<p style="margin:0px 0px 1.2em">That is, the
functional interface type inferred by the compiler (by dropping
wildcards) is now incompatible with the target type (because of
the way in which generics type-argument containment rules work).
To make things work, the client would need at least to do this:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">Quoted<? extends Function<?, ?>> f = (Integer i) -> “”;
</code></pre>
<p style="margin:0px 0px 1.2em">Overall it felt like
we were pushing against the physics of the language here.
Serializable lambdas (with all their limitations) were a strong
precedent to build on top of, which didn’t suffer from any of
the limitations described above.</p>
<p style="margin:0px 0px 1.2em">Maurizio</p>
<div title="MDH:PGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS13cmFwcGVyIiBkYXRhLW1kLXVybD0iIiBzdHlsZT0i
IiBtYXJrZG93bi1oZXJlLXdyYXBwZXItY29udGVudC1tb2RpZmllZD0idHJ1ZSI+PHAgc3R5bGU9
Im1hcmdpbjogMHB4IDBweCAxLjJlbSAhaW1wb3J0YW50OyI+T24gMDYvMDUvMjAyNCAxODo1MCwg
UGF1bCBTYW5kb3ogd3JvdGU6PC9wPgo8cCBzdHlsZT0ibWFyZ2luOiAwcHggMHB4IDEuMmVtICFp
bXBvcnRhbnQ7Ij48L3A+PGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS1leGNsdWRlIj48cD48L3A+
PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkU0QjVDRDJGLTNBM0UtNDhGQS05NkY2
LTBGNzREMURGMjMyMkBvcmFjbGUuY29tIj48cHJlPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIHN0
eWxlPSJjb2xvcjogIzhjOGM4YzsiPjxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+
SnVzdCB3YW50ZWQgdG8gbWVudGlvbiB0aGF0IHRoZXJlIG1pZ2h0IGJlIGFsdGVybmF0aXZlIGlt
cGxlbWVudGF0aW9ucyBhZGRyZXNzaW5nIHRoaXMgcmVxdWlyZW1lbnQuCjEuIFN0cnVjdHVyYWwg
cXVvdGluZyAoYSBsYSBDIykgLSBkZXJpdmVzIGZyb20gdGhlIHZhcmlhYmxlIHR5cGUsIGUuZy4g
UXVvdGVkJmx0O1QmZ3Q7LiBTbywgdGhlIHVzZXIgdW5kZXJzdGFuZHMgdGhhdCB0aGUgbGFtYmRh
IGJvZHkgd2lsbCBiZSBhY2Nlc3NpYmxlLgo8L3ByZT48L2Jsb2NrcXVvdGU+PHByZSBjbGFzcz0i
bW96LXF1b3RlLXByZSIgd3JhcD0iIj5UaGVyZSBhcmUgc29tZSBjaGFsbGVuZ2VzIHdpdGggSmF2
YeKAmXMgdHlwZSBzeXN0ZW0sIHdoaWNoIGlzIHdoeSB3ZSBlbWJlZGRlZCB1cCB3aGVyZSB3ZSBh
cmUgd2l0aCB0aGUgY3VycmVudCBhcHByb2FjaGVzLiBNYXVyaXppbyBpcyBiZXR0ZXIgYWJsZSB0
aGFuIEkgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbGxlbmdlcy48L3ByZT48L3ByZT48L2Jsb2NrcXVv
dGU+PHA+PC9wPjwvZGl2PjxwIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMS4yZW0gIWltcG9ydGFu
dDsiPjwvcD5IaSw8YnI+d2UgaGF2ZSBleHBsb3JlZCBhcHByb2FjaGVzIHN1Y2ggYXMgYFF1b3Rl
ZCZsdDtUJmd0O2AgKHdoZXJlIGBUYCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlKSBlYXJseSBv
bi4gQW5kIGZvdW5kIHRoZW0gYSBiYWQgZml0IGZvciBKYXZhLiBUaGUgbWFpbiBpc3N1ZSB3ZSBm
YWNlZCBpcyB0aGF0IGJlaW5nIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UsIGFzIHBlciB0b2RheeKA
mXMgSkxTLCBpcyBhIHByZWRpY2F0ZSBvbiBjbGFzcyBkZWNsYXJhdGlvbnMgbm90IHR5cGVzICh0
aGVyZSB3YXMgc29tZSBpbnRlbnNlIGRpc2N1c3Npb24gb24gdGhpcyBwb2ludCBkdXJpbmcgSmF2
YSA4KS4gQnV0IGhlcmUgd2UgaGF2ZSBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdHJlYXRlZCBhcyBh
IGZ1bmN0aW9uYWwgaW50ZXJmYWNlIG9yIG5vdCwgcHJlY2lzZWx5IGRlcGVuZGluZyBvbiBpdHMg
dHlwZSAoZS5nLiB0aGUgdHlwZSBwYXJhbWV0ZXIpLiBFLmcuIGEgYFF1b3RhYmxlJmx0O1QmZ3Q7
YCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIG9yIG5vdCBkZXBlbmRpbmcgb24gYFRgLiBUaGlz
IGlzIGEgcHJldHR5IGRlZXAgYmlnIGRlcGFydHVyZSBmcm9tIGhvdyB0aGUgc3BlYyBjdXJyZW50
bHkgZGVhbCB3aXRoIGZ1bmN0aW9uYWwgaW50ZXJmYWNlcy48YnI+PGJyPk9uZSBwb3NzaWJpbGl0
eSB3b3VsZCBiZSBmb3IgdGhlIGNvbXBpbGVyL3NwZWMgdG8gaWdub3JlIHRoZSBgUXVvdGVkJmx0
O1QmZ3Q7YCwgYW5kIGp1c3QgZm9jdXMgb24gdGhlIGlubmVyIGBUYCwgYW5kIHRoZW4gYWRkIHRo
ZSBxdW90aW5nIGJhY2ssIGFmdGVyIHR5cGUtY2hlY2tpbmcuIEJ1dCBkb2luZyBzbyBsZWFkcyB0
byAoYmFkKSBlZGdlIGNhc2VzLiBGb3IgaW5zdGFuY2UsIEphdmEgOCBzdXBwb3J0cyBhIGZvcm0g
b2YgaW5mZXJlbmNlIG9mIHRoZSB0YXJnZXQgdHlwZSBmcm9tIHRoZSBleHBsaWNpdCBsYW1iZGEg
cGFyYW1ldGVyIHR5cGVzLCBpbiB0aGlzIGNhc2U6PGJyPjxicj5gYGBqYXZhPGJyPkZ1bmN0aW9u
Jmx0Oz8sID8mZ3Q7IGYgPSAoSW50ZWdlciBpKSAtJmd0OyAiIjs8YnI+YGBgPGJyPjxicj5JbiB0
aGlzIGNhc2UsIHRoZSB0eXBlIG9mIHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBub3QganVzdCBg
RnVuY3Rpb24mbHQ7PywgPyZndDtgICh0aGUgdGFyZ2V0IHR5cGUpLCBidXQgYEZ1bmN0aW9uJmx0
O0ludGVnZXIsT2JqZWN0Jmd0O2AuIFRoYXQgaXMsIHRoZSBjb21waWxlciB0cmllcyB0byBnZXQg
cmlkIG9mIHRoZSB3aWxkY2FyZHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdHlwZS1jaGVjayB0aGUg
bGFtYmRhIGV4cHJlc3Npb24gKHRoaXMgc3RlcCBpcyBwZXJmb3JtZWQgdG8gYXZvaWQgd2lsZGNh
cmRzIHBvcHBpbmcgdXAgd2hlbiBjaGVja2luZyB0aGUgbGFtYmRhIGJvZHkpLiBCdXQgd2l0aCBx
dW90aW5nLCB0aGlzIHdvbuKAmXQgY29tcG9zZSB3ZWxsIC0gZS5nLjo8YnI+PGJyPmBgYGphdmE8
YnI+UXVvdGVkJmx0O0Z1bmN0aW9uJmx0Oz8sID8mZ3Q7Jmd0OyBmID0gKEludGVnZXIgaSkgLSZn
dDsgIiI7PGJyPmBgYDxicj48YnI+V2lsbCBnaXZlIGFuIGVycm9yOjxicj48YnI+YGBgPGJyPmVy
cm9yOiBpbmNvbXBhdGlibGUgdHlwZXM6IFF1b3RlZCZsdDtGdW5jdGlvbiZsdDtJbnRlZ2VyLCBP
YmplY3QmZ3Q7Jmd0OyBjYW5ub3QgYmUgY29udmVydGVkIHRvIFF1b3RlZCZsdDtGdW5jdGlvbiZs
dDs/LCA/Jmd0OyZndDs8YnI+IFF1b3RlZCZsdDtGdW5jdGlvbiZsdDs/LCA/Jmd0OyZndDsgZiA9
IChJbnRlZ2VyIGkpIC0mZ3Q7IOKAnOKAnTsgPGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXjxicj5gYGA8YnI+
PGJyPlRoYXQgaXMsIHRoZSBmdW5jdGlvbmFsIGludGVyZmFjZSB0eXBlIGluZmVycmVkIGJ5IHRo
ZSBjb21waWxlciAoYnkgZHJvcHBpbmcgd2lsZGNhcmRzKSBpcyBub3cgaW5jb21wYXRpYmxlIHdp
dGggdGhlIHRhcmdldCB0eXBlLiBUbyBtYWtlIHRoaW5ncyB3b3JrLCB0aGUgY2xpZW50IHdvdWxk
IG5lZWQgYXQgbGVhc3QgdG8gZG8gdGhpczo8YnI+PGJyPmBgYDxicj5RdW90ZWQmbHQ7PyBleHRl
bmRzIEZ1bmN0aW9uJmx0Oz8sID8mZ3Q7Jmd0OyBmID0gKEludGVnZXIgaSkgLSZndDsg4oCc4oCd
Ozxicj5gYGA8YnI+PGJyPk92ZXJhbGwgaXQgZmVsdCBsaWtlIHdlIHdlcmUgcHVzaGluZyBhZ2Fp
bnN0IHRoZSBwaHlzaWNzIG9mIHRoZSBsYW5ndWFnZSBoZXJlLiBTZXJpYWxpemFibGUgbGFtYmRh
cyAod2l0aCBhbGwgdGhlaXIgbGltaXRhdGlvbnMpIHdlcmUgYSBzdHJvbmcgcHJlY2VkZW50IHRv
IGJ1aWxkIG9uIHRvcCBvZiwgd2hpY2ggZGlkbuKAmXQgc3VmZmVyIGZyb20gYW55IG9mIHRoZSBs
aW1pdGF0aW9ucyBkZXNjcmliZWQgYWJvdmUuPGJyPuKAizxicj48L2Rpdj4=" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px"></div>
</div>
</div>
</blockquote></div><br clear="all"><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Regards,<br>Konstantin Triger<br></div></div>