Design decisions: forward reference, corralling, method keys
Robert Field
robert.field at oracle.com
Wed May 20 18:16:25 UTC 2015
Here is another option that gets most of the same results in this
obscure case without duplicates, aliasing or other strange new bells and
whistles --
The overwritten key (foo(Baz) in the example below) is dropped.
-Robert
On 05/19/15 13:40, Robert Field wrote:
>
> On 05/19/15 12:33, Brian Goetz wrote:
>>
>>
>>> Maybe Jon's idea that the user entered type names should be the key is
>>> going to yield the least surprising results.
>>
>> That's what I (thought I) was suggesting too.
>>
>> Where the anomaly comes is:
>>
>> void foo(Baz b) { }
>> -> key k1
>>
>> void foo(com.bar.Baz b) { } // redeclaration of above foo!
>> -> new key k2, *but which ultimately describes same member as k1*
>>
>> That is, the second foo replaces the first (its signature is the
>> same), but there are now two keys describing the same thing.
>> (Admittedly a corner case.)
>
> Currently, the Key is both the external and internal key. That
> creates clean semantics. But also the possibility of the ambiguity
> error I described (below).
> What you are describing has some internal magic that know that two
> keys are the same (thus the internal key is different than the
> external), and the complexity comes when that mapping can change over
> time.
>
> As a first (or final) step we would make method key type parameters be
> the user entered type parameters.
>
>>
>>> With that choice, all the above would be one key.
>>> There could still be ambiguity errors:
>>>
>>> void w(Set x) { }
>>> void w(java.util.Set x) { }
>>> w(new HashSet())
>>>
>>> But in that case, which seems far less likely to occur, the key
>>> descriptors of the methods would distinct:
>>>
>>> | Error:
>>> | reference to w is ambiguous
>>> | both method w(Set) in and method w(java.util.Set) in match
>>>
>>> So it would be clear what to drop.
>>>
>>> -Robert
>>>
>
> -Robert
>
More information about the kulla-dev
mailing list