Details
-
Improvement
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
None
-
None
Description
Groovy provides a nice string representation for collection objects, however the current behaviour do not allow custom collection classes to provide own string representation not to implement a custom object identity rule.
For example:
class Mylist extends ArrayList { Mylist(Collection c) { super(c) } @Override boolean equals(Object o) { throw new UnsupportedOperationException () } @Override int hashCode() { throw new UnsupportedOperationException () } @Override String toString() { return 'CUSTOM STRING' } } def l = new Mylist([1,2,3]) assert l.toString() == 'CUSTOM STRING' assert "$l" == '[1, 2, 3]' def q = new Mylist([1,2,3]) assert l.equals(q) assert l == q
In the Mylist class the toString method is not invoked in the string interpolation and equals is not invoked by the == operator. This breaks the java polymorphism contract and create several hassles when implementing custom collection classes.
I would propose to fix this behaviour in Groovy 3.0. It would be enough to check if the target class implements the toString and equals methods otherwise fallback on the current Groovy behaviour.