[records] customized accessor returning subtype

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Dec 10 15:07:53 UTC 2019


On 10/12/2019 00:36, Alex Buckley wrote:
> I'm glad this was asked and answered during CSR, but I think Dmitry is 
> clear about WHAT the spec says. I believe he is asking WHY an explicit 
> accessor's return type must be identical to the component's type.
>
> At the heart of the matter is the fact that a Number-typed component 
> implies a Number-typed field. Code in an accessor with an Integer 
> return type would have to downcast the field often, or at least 
> sometimes. Everything about that accessor makes it harder to 
> understand the state of the record *which was meant to be plain from 
> the Number component*. Does the "true" state involve a Number or an 
> Integer, and does it depend on other conditions, and when, and why? A 
> covariant override is for when a subclass adds specialization, but 
> there's no specialization to be gained within a record.
>
Not to mention the fact that, as soon as you go down that path 
(covariant accessors) some developers could ask for the dual 
(contravariant constructor parameters) - at which point I think we're 
well past the design center for records.

Maurizio

> Alex
>
> On 12/9/2019 4:04 PM, Joe Darcy wrote:
>> FYI, this issue was raised in the CSR review:
>>
>>> In "An implicitly declared public accessor method with the same name 
>>> as the record component, whose return type is the declared type of 
>>> the record component, unless a public method with the same signature 
>>> is explicitly declared in the body of the declaration of R."
>>>
>>> does that imply a "covariant override" accessor can be explicitly 
>>> defined as the signature does not include the return type? For 
>>> example if the component had a type of Object and the user defined 
>>> an accesssor method with a type of String? Would a bridge method 
>>> need to be defined? Should the return type be constrained to match too?
>>>
>>
>> https://bugs.openjdk.java.net/browse/JDK-8233433?focusedCommentId=14302123&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14302123 
>>
>>
>> and replied to
>>
>>> This is a very good question. I've actually changed the description 
>>> of accessor methods and constructor methods to make this clearer (I 
>>> hope). In essence there is a two stage process. For accessor 
>>> methods: If you have the name of a component and an empty formal 
>>> parameter list, then you are considered to be an accessor method for 
>>> the component. We then ask additional criteria of you - it's a 
>>> compile-time error if you don't satisfy them! This includes having a 
>>> return type that is identical to the derived type of the record 
>>> component, being |public|, etc. It's essentially the same for 
>>> constructors: a record component list essentially derives a 
>>> canonical constructor signature. If you are a constructor that is 
>>> override-equivalent, then you are a canonical constructor. We then 
>>> ask additional criteria of you, being |public|, not being generic, etc.
>>>
>>> These definitions clear up a lot of corner cases, and more 
>>> importantly lead to better error messages. (In your particular 
>>> example, the |String| returning method would /not/ be an accessor 
>>> for the |Object| component, so one would be implicitly declared for 
>>> you, and then you'd get an error as we'd have two overloads with 
>>> identical signatures).
>>>
>> https://bugs.openjdk.java.net/browse/JDK-8233433?focusedCommentId=14302457&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14302457 
>>
>>
>> Cheers,
>>
>> -Joe
>>
>> On 12/9/2019 11:09 AM, Dmitry Bessonov wrote:
>>> Is there any reason for not allowing a customized accessor to return 
>>> rc subtype:
>>>
>>> record R(Number number) {
>>>      public Integer number() {
>>>          return 42;
>>>      }
>>> }
>>>
>>> Error: java: invalid accessor method in record R
>>>    (return type of accessor method number() is not compatible with 
>>> type of record component number)
>>>
>>>
>>> dmitry
>>>


More information about the amber-dev mailing list