[
https://issues.apache.org/jira/browse/GROOVY-9003?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16774862#comment-16774862
]
paolo di tommaso commented on GROOVY-9003:
------------------------------------------
I should have clarified better, the proposal is to skip the groovy
representation when class *declares* the `toString` method (it
getDeclaredMethod vs getMethod). In this case between the mentioned classes
remain the following:
{code}
Vector, ArrayBlockingQueue, LinkedBlockingDeque, LinkedBlockingQueue,
PriorityBlockingQueue
{code}
However it should be noted that the string representation they implement is the
same as the groovy one.
{code}
def v = new Vector()
v << 1
v << 'hello'
v << 'world'
def a = new java.util.concurrent.ArrayBlockingQueue(1)
a << 1
a << 'hello'
a << 'world'
assert v.toString() == "$v"
assert a.toString() == "$a"
{code}
> Allow the override of toString and equals methods for collection objects
> -------------------------------------------------------------------------
>
> Key: GROOVY-9003
> URL: https://issues.apache.org/jira/browse/GROOVY-9003
> Project: Groovy
> Issue Type: Improvement
> Reporter: paolo di tommaso
> Priority: Major
> Fix For: 3.x
>
>
> 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:
> {code:java}
> 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
> {code}
> 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.
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)