[ https://issues.apache.org/jira/browse/TINKERPOP-3015?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17798300#comment-17798300 ]
Christopher Smith commented on TINKERPOP-3015: ---------------------------------------------- There exists a compilation error with that exact code in 3.5, and I suspect it also exists in 3.6 and 3.7. Specifically, even if your code words by coincidence, I believe inspecting the generated bytecode (e.g., with {{javap -v}}) will show that the wrong overload is being selected. {code}Collection<String> asString = List.of("a", "b"); @SuppressWarnings({ "unchecked", "rawtypes" }) Collection<Object> asObject = (Collection) asString; gts.V().hasId(P.within(asString)).iterate(); gts.V().hasId(P.within(asObject)).iterate(); {code} correctly produces the following bytecode snippet, where you can see that the invocation of {{hasId(P<String>)}} is resolved to {{hasId(Object, Object...)}} {code} #60 = InterfaceMethodref #61.#63 // org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.hasId:(Ljava/lang/Object;[Ljava/lang/Object;)Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #61 = Class #62 // org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal #62 = Utf8 org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal #63 = NameAndType #64:#65 // hasId:(Ljava/lang/Object;[Ljava/lang/Object;)Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #64 = Utf8 hasId #65 = Utf8 (Ljava/lang/Object;[Ljava/lang/Object;)Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #66 = InterfaceMethodref #61.#67 // org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.iterate:()Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #67 = NameAndType #68:#69 // iterate:()Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #68 = Utf8 iterate #69 = Utf8 ()Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; #70 = InterfaceMethodref #61.#71 // org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.hasId:(Lorg/apache/tinkerpop/gremlin/process/traversal/P;)Lorg/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal; {code} The fact that this produces the desired results in the current implementation is an implementation detail and not guaranteed by the API semantics. > Use wildcard instead of Object for hasId predicates > --------------------------------------------------- > > Key: TINKERPOP-3015 > URL: https://issues.apache.org/jira/browse/TINKERPOP-3015 > Project: TinkerPop > Issue Type: Improvement > Affects Versions: 3.5.7, 3.6.5 > Reporter: Christopher Smith > Priority: Minor > > From both {{GraphTraversal}} and {{__}}, the {{hasId(P)}} steps specify a > {{P<Object>}}. Common predicates, such as {{within}}, propagate the generic > type from their own arguments, so that this produces a compile-time error: > {code} > Collection<String> ids = ... > g.V().hasId(P.within(ids)) > {code} > I believe that without loss of safety, the signature in both locations could > be changed to {{P<?>}}, making the typical case of "here's a collection of > IDs of known type" work smoothly. -- This message was sent by Atlassian Jira (v8.20.10#820010)