gremlin> g = TinkerFactory.createModern()
gremlin> g.V(1).as('a').values('name')
==>marko
gremlin> g.V(1).as('a').out('knows').back('a').values('name')
==>marko
==>marko
gremlin> g.V(1).as('a').out('knows').back('a').out('knows').back('a').values('name')
==>marko
==>marko
==>marko
==>marko
gremlin> g.V(1).as('a').out('knows').back('a').as('a').out('knows').back('a').values('name')
java.util.ArrayList cannot be cast to com.tinkerpop.gremlin.structure.Element
Because there are two steps labeled 'a', the value converts to a list, so the 'values' step fails. You can see that by leaving it off:
gremlin> g.V(1).as('a').out('knows').back('a').as('a').out('knows').back('a')
==>[v[1], v[1]]
==>[v[1], v[1]]
==>[v[1], v[1]]
==>[v[1], v[1]]
In the Java API, 'back' must know the type <E2> it will emit.
public default <E2> GraphTraversal<S, E2> back(final String stepLabel);
gremlin> g.V(1).repeat(__.as('a').out().back('a')).times(2).values('name')
java.util.ArrayList cannot be cast to com.tinkerpop.gremlin.structure.Element
gremlin> g.V(1).as('a').map{it.path('a')}
==>v[1]
gremlin> g.V(1).as('a').out().as('a').map{it.path('a')}
==>v[3]
==>v[2]
==>v[4]
gremlin> g.V(1).as('a').out().as('a').out().as('a').map{it.path('a')}
==>v[5]
==>v[3]
==>[v[1], v[1]]
==>[v[1], v[1]]
==>[v[1], v[1]]
gremlin> g.V(1).as('a').out().as('a').out().as('a').back('a')
==>[v[1], v[4], v[5]]
==>[v[1], v[4], v[3]]
gremlin> g.V(1).as('a').out().as('a').out().as('a').select('a')
==>v[5]
==>v[3]