RFR: [type-classes] Initial work to enable type-classes mediated operator support [v2]

Sylv duke at openjdk.org
Sun Jan 25 22:21:21 UTC 2026


On Fri, 23 Jan 2026 10:52:12 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> This PR adds experimental support for type-class based operator resolution. This means that it is possible to define classes that "witness" some numerical type class, like so:
>> 
>> 
>> record Box(int i) {
>>    __witness Integral<Box> INTEGRAL = ...
>> }
>> 
>> 
>> Then, we can start using `Box` in e.g. binary operations, like so:
>> 
>> 
>> Box one = new Box(1);
>> Box two = new Box(2);
>> one + two // three
>> 
>> 
>> In order to support type-class mediated operator resolution, we needed to add a new kind of operator helper in `Operators`. These new operator helpers (one for unary operators, one for binary operators) wrap some method in one of the standard numeric classes -- for instance, type class `+` is realized through `Numerical::add`, and so forth.
>> 
>> There's a new kind of operator symbol, namely `TypeClassOperatorSymbol` which is used to store the type of the operation as well as the method symbol in charge of performing the operation.
>> 
>> To resolve an operator, we basically have to prove that a witness for the corresponding class, parameterized by the operand type exists. E.g. in the above, we need to find a witness for `Numerical<Box>`.
>> 
>> During lowering, we emit such witness, and call the correct operator method on it.
>> 
>> Note that support for assignment operators is also provided -- `Lower` already has logic to lower some assignment operators into plain binary operations, so we just leverage that support to translate type-class based assignment ops.
>
> Maurizio Cimadamore has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Test cleanup

Why `__witness`? Why can't it be an annotation like `@Witness` or even `@OperatorOverload`? Also, why an anonymous class???

-------------

PR Comment: https://git.openjdk.org/valhalla/pull/1948#issuecomment-3797321673


More information about the valhalla-dev mailing list