<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">While I agree that
what javac does is against the JLS, is this a javac or a spec
bug?</p>
<p style="margin: 0px 0px 1.2em !important;">I mean, consider this
hierarchy:</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;">class Sup<X> {
Sup(X x) { ... }
}
class Sub<Y> extends Sup<Y> {
Sub(Y y) {
super(y);
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">What the rules are
saying is that “y” in the Sub super call should be evaluated in
a static context. But that doesn’t make any sense - because Y is
not even a valid type in such a static context.</p>
<p style="margin: 0px 0px 1.2em !important;">And yet - this is a
valid program. So, if typechecking “y” is correct, then, surely,
typechecking “(Y)y” should also be correct? E.g. it seems to me
that the use of “static context” here is an “approximation” for
the behavior we really want (e.g. no access to instance fields,
whether directly or indirectly).</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 01/02/2023 22:39,
Alex Buckley wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:21690dfc-9970-d1c8-a3ee-cb655d27f10a@oracle.com">Your
reading of the JLS is correct. The cast expression `(T)obj`
occurs in a static context, so the use of T should be
disallowed, and javac should reject the program.
<br>
<br>
These rules in 8.8.7.1 and 8.1.3 are longstanding, and have
not changed recently, so I'm surprised that javac lets the
program through. That said, JLS16 saw a reworking of 8.1.3
(driven by
<a class="moz-txt-link-freetext" href="https://openjdk.org/jeps/395#Static-members-of-inner-classes">https://openjdk.org/jeps/395#Static-members-of-inner-classes</a>)
and perhaps javac got a bit turned around over static
contexts.
<br>
<br>
As an additional test case, make the constructor generic --
`public <U extends T> TypeParam ...` -- and cast obj to
U rather than T -- still illegal.
<br>
<br>
Alex
<br>
<br>
On 2/1/2023 12:45 PM, Archie Cobbs wrote:
<br>
<blockquote type="cite">This program compiles without error:
<br>
<br>
import java.util.concurrent.atomic.*;
<br>
public class TypeParamStaticContext<T> extends
AtomicReference<T> {
<br>
public TypeParamStaticContext(Object obj) {
<br>
super((T)obj);
<br>
}
<br>
}
<br>
<br>
Yet according to my reading of the JLS, the appearance of T
inside the super() call should be disallowed:
<br>
<br>
§8.8.7.1 <a class="moz-txt-link-rfc2396E" href="http://8.8.7.1"><http://8.8.7.1></a>:
<br>
<br>
An explicit constructor invocation statement introduces a
static context (§8.1.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3></a>),
which limits the use of constructs that refer to the current
object. Notably, the keywords |this| and |super| are
prohibited in a static context (§15.8.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.8.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.8.3></a>,
§15.11.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.11.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.11.2></a>),
as are unqualified references to instance variables,
instance methods, and type parameters of lexically enclosing
declarations (§6.5.5.1
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.5.1"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.5.1></a>,
§6.5.6.1
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.6.1"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.5.6.1></a>,
§15.12.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.12.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.12.3></a>).<br>
<br>
§6.5.5.1 <a class="moz-txt-link-rfc2396E" href="http://6.5.5.1"><http://6.5.5.1></a>:
<br>
<br>
If a type name consists of a single /Identifier/, then the
identifier must occur in the scope of exactly one
declaration of a class, interface, or type parameter with
this name (§6.3
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-6.html#jls-6.3></a>),
or a compile-time error occurs.
<br>
<br>
If the declaration denotes a type parameter of a generic
class or interface C (§8.1.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.2></a>,
§9.1.2
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-9.html#jls-9.1.2"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-9.html#jls-9.1.2></a>),
then both of the following must be true, or a compile-time
error occurs:
<br>
<br>
*
<br>
<br>
The type name does not occur in a static context (§8.1.3
<br>
<a class="moz-txt-link-rfc2396E" href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3"><https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.1.3></a>)<br>
<br>
*
<br>
<br>
If the type name appears in a nested class or interface
declaration
<br>
of C, then the immediately enclosing class or interface
declaration
<br>
of the type name is an inner class of C.
<br>
<br>
<br>
What am I missing?
<br>
<br>
Thanks,
<br>
-Archie
<br>
<br>
-- <br>
Archie L. Cobbs
<br>
</blockquote>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div title="MDH:PHA+V2hpbGUgSSBhZ3JlZSB0aGF0IHdoYXQgamF2YWMgZG9lcyBpcyBhZ2FpbnN0IHRoZSBKTFMsIGlzIHRoaXMgYSBqYXZhYyBvciBhIHNwZWMgYnVnPzwvcD48cD5JIG1lYW4sIGNvbnNpZGVyIHRo
aXMgaGllcmFyY2h5OjwvcD48cD5gYGA8YnI+Y2xhc3MgU3VwJmx0O1gmZ3Q7IHs8YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7IFN1cChYIHgpIHsgLi4uIH08YnI+fTwvcD48cD5jbGFzcyBTdWImbHQ7WSZn
dDsgZXh0ZW5kcyBTdXAmbHQ7WSZndDsgezxicj4mbmJzcDsmbmJzcDsgU3ViKFkgeSkgezxicj4m
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3VwZXIoeSk7PGJyPiZu
YnNwOyZuYnNwOyB9PGJyPn08YnI+YGBgPGJyPjwvcD48cD5XaGF0IHRoZSBydWxlcyBhcmUgc2F5
aW5nIGlzIHRoYXQgInkiIGluIHRoZSBTdWIgc3VwZXIgY2FsbCBzaG91bGQgYmUgZXZhbHVhdGVk
IGluIGEgc3RhdGljIGNvbnRleHQuIEJ1dCB0aGF0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgLSBi
ZWNhdXNlIFkgaXMgbm90IGV2ZW4gYSB2YWxpZCB0eXBlIGluIHN1Y2ggYSBzdGF0aWMgY29udGV4
dC48L3A+PHA+QW5kIHlldCAtIHRoaXMgaXMgYSB2YWxpZCBwcm9ncmFtLiBTbywgaWYgdHlwZWNo
ZWNraW5nICJ5IiBpcyBjb3JyZWN0LCB0aGVuLCBzdXJlbHksIHR5cGVjaGVja2luZyAiKFkpeSIg
c2hvdWxkIGFsc28gYmUgY29ycmVjdD8gRS5nLiBpdCBzZWVtcyB0byBtZSB0aGF0IHRoZSB1c2Ug
b2YgInN0YXRpYyBjb250ZXh0IiBoZXJlIGlzIGFuICJhcHByb3hpbWF0aW9uIiBmb3IgdGhlIGJl
aGF2aW9yIHdlIHJlYWxseSB3YW50IChlLmcuIG5vIGFjY2VzcyB0byBpbnN0YW5jZSBmaWVsZHMs
IHdoZXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuPC9wPjxwPk1hdXJpemlvPGJyPjwvcD48
cD48YnI+PC9wPjxwPjxicj48L3A+PGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAwMS8w
Mi8yMDIzIDIyOjM5LCBBbGV4IEJ1Y2tsZXkgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5
cGU9ImNpdGUiIGNpdGU9Im1pZDoyMTY5MGRmYy05OTcwLWQxYzgtYTNlZS1jYjY1NWQyN2YxMGFA
b3JhY2xlLmNvbSI+WW91ciByZWFkaW5nIG9mIHRoZSBKTFMgaXMgY29ycmVjdC4gVGhlIGNhc3Qg
ZXhwcmVzc2lvbiBgKFQpb2JqYCBvY2N1cnMgCmluIGEgc3RhdGljIGNvbnRleHQsIHNvIHRoZSB1
c2Ugb2YgVCBzaG91bGQgYmUgZGlzYWxsb3dlZCwgYW5kIGphdmFjIApzaG91bGQgcmVqZWN0IHRo
ZSBwcm9ncmFtLgo8YnI+Cjxicj5UaGVzZSBydWxlcyBpbiA4LjguNy4xIGFuZCA4LjEuMyBhcmUg
bG9uZ3N0YW5kaW5nLCBhbmQgaGF2ZSBub3QgY2hhbmdlZCAKcmVjZW50bHksIHNvIEknbSBzdXJw
cmlzZWQgdGhhdCBqYXZhYyBsZXRzIHRoZSBwcm9ncmFtIHRocm91Z2guIFRoYXQgCnNhaWQsIEpM
UzE2IHNhdyBhIHJld29ya2luZyBvZiA4LjEuMyAoZHJpdmVuIGJ5IApodHRwczovL29wZW5qZGsu
b3JnL2plcHMvMzk1I1N0YXRpYy1tZW1iZXJzLW9mLWlubmVyLWNsYXNzZXMpIGFuZCAKcGVyaGFw
cyBqYXZhYyBnb3QgYSBiaXQgdHVybmVkIGFyb3VuZCBvdmVyIHN0YXRpYyBjb250ZXh0cy4KPGJy
Pgo8YnI+QXMgYW4gYWRkaXRpb25hbCB0ZXN0IGNhc2UsIG1ha2UgdGhlIGNvbnN0cnVjdG9yIGdl
bmVyaWMgLS0gYHB1YmxpYyAmbHQ7VSAKZXh0ZW5kcyBUJmd0OyBUeXBlUGFyYW0gLi4uYCAtLSBh
bmQgY2FzdCBvYmogdG8gVSByYXRoZXIgdGhhbiBUIC0tIHN0aWxsIAppbGxlZ2FsLgo8YnI+Cjxi
cj5BbGV4Cjxicj4KPGJyPk9uIDIvMS8yMDIzIDEyOjQ1IFBNLCBBcmNoaWUgQ29iYnMgd3JvdGU6
Cjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5UaGlzIHByb2dyYW0gY29tcGlsZXMgd2l0aG91
dCBlcnJvcjoKPGJyPgo8YnI+aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy4qOwo8
YnI+cHVibGljIGNsYXNzIFR5cGVQYXJhbVN0YXRpY0NvbnRleHQmbHQ7VCZndDsgZXh0ZW5kcyBB
dG9taWNSZWZlcmVuY2UmbHQ7VCZndDsgewo8YnI+Jm5ic3A7Jm5ic3A7ICZuYnNwOyBwdWJsaWMg
VHlwZVBhcmFtU3RhdGljQ29udGV4dChPYmplY3Qgb2JqKSB7Cjxicj4mbmJzcDsmbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsgc3VwZXIoKFQpb2JqKTsKPGJyPiZuYnNwOyZuYnNwOyAmbmJzcDsg
fQo8YnI+fQo8YnI+Cjxicj5ZZXQgYWNjb3JkaW5nIHRvIG15IHJlYWRpbmcgb2YgdGhlIEpMUywg
dGhlIGFwcGVhcmFuY2Ugb2YgVCBpbnNpZGUgdGhlIApzdXBlcigpIGNhbGwgc2hvdWxkIGJlIGRp
c2FsbG93ZWQ6Cjxicj4KPGJyPsKnOC44LjcuMSAmbHQ7aHR0cDovLzguOC43LjEmZ3Q7Ogo8YnI+
Cjxicj5BbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHN0YXRlbWVudCBpbnRyb2R1
Y2VzIGEgc3RhdGljIGNvbnRleHQgCijCpzguMS4zIAombHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5j
b20vamF2YXNlL3NwZWNzL2pscy9zZTE5L2h0bWwvamxzLTguaHRtbCNqbHMtOC4xLjMmZ3Q7KSwg
d2hpY2ggbGltaXRzIHRoZSB1c2Ugb2YgY29uc3RydWN0cyB0aGF0IHJlZmVyIHRvIHRoZSBjdXJy
ZW50IG9iamVjdC4gTm90YWJseSwgdGhlIGtleXdvcmRzIHx0aGlzfCBhbmQgfHN1cGVyfCBhcmUg
cHJvaGliaXRlZCBpbiBhIHN0YXRpYyBjb250ZXh0ICjCpzE1LjguMyAmbHQ7aHR0cHM6Ly9kb2Nz
Lm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9zZTE5L2h0bWwvamxzLTE1Lmh0bWwjamxzLTE1
LjguMyZndDssIMKnMTUuMTEuMiAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3Nw
ZWNzL2pscy9zZTE5L2h0bWwvamxzLTE1Lmh0bWwjamxzLTE1LjExLjImZ3Q7KSwgYXMgYXJlIHVu
cXVhbGlmaWVkIHJlZmVyZW5jZXMgdG8gaW5zdGFuY2UgdmFyaWFibGVzLCBpbnN0YW5jZSBtZXRo
b2RzLCBhbmQgdHlwZSBwYXJhbWV0ZXJzIG9mIGxleGljYWxseSBlbmNsb3NpbmcgZGVjbGFyYXRp
b25zICjCpzYuNS41LjEgJmx0O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9q
bHMvc2UxOS9odG1sL2pscy02Lmh0bWwjamxzLTYuNS41LjEmZ3Q7LCDCpzYuNS42LjEgJmx0O2h0
dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy02Lmh0
bWwjamxzLTYuNS42LjEmZ3Q7LCDCpzE1LjEyLjMgJmx0O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29t
L2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy0xNS5odG1sI2pscy0xNS4xMi4zJmd0Oyku
Cjxicj4KPGJyPsKnNi41LjUuMSAmbHQ7aHR0cDovLzYuNS41LjEmZ3Q7Ogo8YnI+Cjxicj5JZiBh
IHR5cGUgbmFtZSBjb25zaXN0cyBvZiBhIHNpbmdsZSAvSWRlbnRpZmllci8sIHRoZW4gdGhlIGlk
ZW50aWZpZXIgCm11c3Qgb2NjdXIgaW4gdGhlIHNjb3BlIG9mIGV4YWN0bHkgb25lIGRlY2xhcmF0
aW9uIG9mIGEgY2xhc3MsIAppbnRlcmZhY2UsIG9yIHR5cGUgcGFyYW1ldGVyIHdpdGggdGhpcyBu
YW1lICjCpzYuMyAKJmx0O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMv
c2UxOS9odG1sL2pscy02Lmh0bWwjamxzLTYuMyZndDspLCBvciBhIGNvbXBpbGUtdGltZSBlcnJv
ciBvY2N1cnMuCjxicj4KPGJyPklmIHRoZSBkZWNsYXJhdGlvbiBkZW5vdGVzIGEgdHlwZSBwYXJh
bWV0ZXIgb2YgYSBnZW5lcmljIGNsYXNzIG9yIAppbnRlcmZhY2UgQyAowqc4LjEuMiAKJmx0O2h0
dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxOS9odG1sL2pscy04Lmh0
bWwjamxzLTguMS4yJmd0Oywgwqc5LjEuMiAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2
YXNlL3NwZWNzL2pscy9zZTE5L2h0bWwvamxzLTkuaHRtbCNqbHMtOS4xLjImZ3Q7KSwgdGhlbiBi
b3RoIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlLCBvciBhIGNvbXBpbGUtdGltZSBlcnJv
ciBvY2N1cnM6Cjxicj4KPGJyPiZuYnNwOyAqCjxicj4KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBU
aGUgdHlwZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgc3RhdGljIGNvbnRleHQgKMKnOC4xLjMK
PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNl
L3NwZWNzL2pscy9zZTE5L2h0bWwvamxzLTguaHRtbCNqbHMtOC4xLjMmZ3Q7KQo8YnI+Cjxicj4m
bmJzcDsgKgo8YnI+Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgSWYgdGhlIHR5cGUgbmFtZSBhcHBl
YXJzIGluIGEgbmVzdGVkIGNsYXNzIG9yIGludGVyZmFjZSBkZWNsYXJhdGlvbgo8YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7IG9mIEMsIHRoZW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBv
ciBpbnRlcmZhY2UgZGVjbGFyYXRpb24KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBvZiB0aGUgdHlw
ZSBuYW1lIGlzIGFuIGlubmVyIGNsYXNzIG9mIEMuCjxicj4KPGJyPgo8YnI+V2hhdCBhbSBJIG1p
c3Npbmc/Cjxicj4KPGJyPlRoYW5rcywKPGJyPi1BcmNoaWUKPGJyPgo8YnI+LS0mbmJzcDs8YnI+
QXJjaGllIEwuIENvYmJzCjxicj48L2Jsb2NrcXVvdGU+PC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>