----- Mail original -----
> De: "daniel smith" <daniel.sm...@oracle.com>
> À: "Remi Forax" <fo...@univ-mlv.fr>
> Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>
> Envoyé: Jeudi 7 Mai 2020 23:06:44
> Objet: Re: Class & interface terminology

>> On May 7, 2020, at 1:47 PM, Remi Forax <fo...@univ-mlv.fr> wrote:
>> 
>> There is a good reason why it is done that way, i.e. enum is called enum and 
>> not
>> enum class or annotation type is not called annotation interface.
>> It's to avoid the confusion between the feature of the language and its
>> translation strategy, an annotation type is not an interface, the translation
>> strategy uses an interface (and some attributes), but it's not an interface, 
>> an
>> enum is not abstract despite the fact that it can be translated to an 
>> abstract
>> class, etc.
>> 
>> This can even be dangerous, if we then want by example introduce a more 
>> abstract
>> record that is translated to an interface. The feature is record, not record
>> class, like the feature is enum, not enum class.
>> 
>> Moreover, this has been discussed ad-nauseam during the Java 5 timeframe, i
>> don't see the point to change that now.
> 
> 
> To contextualize this: you're expressing a narrow concern that "enum" -> "enum
> class" and "annotation type" -> "annotation interface" may not be appropriate
> renamings, and that these were (maybe?) intentionally avoided when those
> features were designed. "Record" -> "record class" would have similar issues.

No, i disagree about to things
- trying to tilt each features to be either an interface or an class is not 
appropriate
- use classes or interfaces as a kind of composed word with the same meaning as 
"declared type". 

I don't say that the JLS should not be fixed, as you are showing the is a lot 
of case where by example, inner class also means local class or declared types 
shouls also includes type parameters.
But using "class and/or interface" goes in the opposite direction for me, it's 
not a specific term.

> 
> I disagree with the assertion that an [annotation type/interface] is not an
> interface. JLS Chapter 9 is quite clear that an [annotation type/interface] is
> a special kind of interface. Among other things, this means that you're 
> allowed
> to declare a class that implements an [annotation type/interface].

Disagreeing by citing one things allowed by both an annotation type and 
interface is not an argument, it's an anecdote. As i said in my previous mail, 
the annotation type is a small part of the annotation feature.

> 
> Same comment for [enums/enum types/enum classes] and Chapter 8. 8.9 doesn't 
> say
> anything about whether the class is 'abstract', but it is clear that the class
> may or may not be 'final', depending on the format of the enum constants.

i would hope it says the enum is final or not, not the underlying class.

> 
> None of this has anything to do with translation strategy. We're just talking
> about the language and the entities it uses to describe its semantics.
> 
> If, per your example, we were to introduce a form of record declaration that
> specifies an interface, we would need to say so explicitly, and start talking
> about "record classes" and "record interfaces". Among other things, this
> distinction might matter so that I would know whether I'm supposed to 'extend'
> it or 'implement' it.

i would hope the JLS talk about record and abstract record.

> 
> Anyway, there's nothing wrong with saying plain "enum" or "record" when you're
> talking about these features. We do so quite a bit in JEP 384 (Records Second
> Preview), for example. In some contexts, though, precision is important, and 
> in
> those contexts, it's useful to emphasize the fact that an [enum/enum type/enum
> class] is just one kind of class, and so everything that talks generally about
> "classes" is talking about them, too. (There are, in JLS 14, a number of
> partial efforts to say "or enum type" when talking about classes and
> interfaces, but it's totally ad hoc, nowhere near universal, and, it turns 
> out,
> not necessary.)
> 
>> Yes it means that "type" is overloaded but it's part of our heritage, yes, 
>> this
>> means you have to use static type and dynamic type sometimes where you can 
>> use
>> type and class, but i don't see the point to change something that was agreed
>> 20 years ago. In fact, it seems to be the worst time to introduce such 
>> change,
>> soon we will introduce reified generics that may force us to redefine the 
>> exact
>> relation between a class and a type for the language and the VM so it's wiser
>> to wait until we all have a clear vision of how things work, instead of
>> changing things for the sake of changing them.
> 
> I think this is a more general critique about avoiding "type" when what is 
> meant
> is "class or interface".
> 
> A couple of points:
> 
> - I don't think anything was ever "agreed to", and I don't think this is a
> wholesale change. The language has evolved over the years, with different
> pieces violating assumptions that made sense before, and the use of 
> terminology
> evolving in piecemeal fashion to keep up. The goal here is to standardize what
> has evolved across all the pieces. In some cases that means changing
> terminology A to align with B (e.g., existing uses of "type declaration" and
> "class or interface"), but the status quo is that A and B are inconsistent, so
> to produce something consistent, something has to change.
> 
> - I think you're overestimating the footprint of the change here. This isn't a
> "redesign all the terminology from scratch" exercise. It's making some
> adjustments around the edges to keep things in good shape. Those changes touch
> a lot of things; but if, say, we were to embrace "type" as the standard way to
> say "class or interface", a lot *more* things would need to change.

I can only trust you on this, I still thing that using "class and/or interface" 
is not the good term.

> 
> - Considerations for Valhalla are very much a part of why this is at the top 
> of
> my mind. The point is not to define precisely the relationship between classes
> and types. Instead, the point is to recognize that *these are distinct
> entities*, and there is space in the design for different kinds of
> relationships between them. We have a clear enough vision at this point to 
> know
> that making such a distinction is likely to be an important part of whatever
> Valhalla ends up doing.

I think you know far more than me on this subject, because i have still no idea 
on what is partially specializable or not.

Rémi

Reply via email to