<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="" markdown-here-wrapper-content-modified="true">
<p style="margin: 0px 0px 1.2em !important;">On 06/05/2024 18:50,
Paul Sandoz wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:E4B5CD2F-3A3E-48FA-96F6-0F74D1DF2322@oracle.com">
<pre><blockquote type="cite" style="color: #8c8c8c;"><pre class="moz-quote-pre" wrap="">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 class="moz-quote-pre" wrap="">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 !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">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 !important;">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-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" 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;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;">Function<?, ?> f = (Integer i) -> <span class="hljs-string" style="color: rgb(221, 17, 68);">""</span>;
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">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-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" 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;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;">Quoted<Function<?, ?>> f = (Integer i) -> <span class="hljs-string" style="color: rgb(221, 17, 68);">""</span>;
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Will give an error:</p>
<pre style="font-size: 0.85em; 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; 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;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">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 !important;">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-size: 0.85em; 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; 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;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">Quoted<? extends Function<?, ?>> f = (Integer i) -> “”;
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">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 !important;">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:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>