[英]Generic method How can I define with my class type?
我想使用用泛型类型实现的番石榴库。 现在在我的代码中我必须使用它们,但我不熟悉使用泛型方法。
这是来自 API 的方法描述:
public static <N> Set<N> reachableNodes(Graph<N> graph, N node)
此方法返回可从图中的一个节点访问的一组节点。
在我的项目中,我将图形 class 作为“图形”,将节点 class 作为“节点”,我想用我的类替换该方法。我尝试过这样,但出现错误:
Set<Node> reachableNodes = new HashSet<>();
reachableNodes= Graphs.<Graph, Node>reachableNodes(g, n);
这里 g 是图形 class 类型,n 是节点类型。
错误提示“Graphs 类型的泛型方法reachableNodes(Graph, N) 的类型arguments 的数量不正确;它不能用arguments <Graph, Node> 参数化”。
你能帮我么?
提前致谢。
public <N> Set<N> reachableNode
中的第一个<N>
声明了它。 就像void foo(int x)
x
的 x :它决定它的存在,它没有定义它是什么,或者使用它。 所有其他用法都在使用它。 顾名思义,类型变量的“值”是一个类型(如int
、 Object
或Map<List<? extends String>, ? super Number>
),就像int x
的“值”是 integer .
对于任何给定的方法调用,类型变量都是“设置”的。 因此,每当您调用此方法时, N
就是某种东西。 每次调用都会设置它,就像方法void foo(int x)
获取自己的 x 一样。 foo(5)
? 那么 x 是 5。 foo(10)
? 那么 x 是 10。
通常,java 将尝试自动找出适合给定类型变量的值。 为了让 java 执行此操作,您的调用需要一些上下文(参数,或如何使用它,或两者兼而有之)。 在这种情况下,有足够的支持: reachableNodes
方法返回一个N = Node
Set<N>
,然后您将调用它的结果分配给一个Set<Node>
类型的变量: N = Node
,然后它“工作”。 大概相同的规则适用于您对变量n
(无疑是 Node 类型)和g
(大概是Graph<Node>
类型)的使用。所有 3 人都说同样的话:如果 N 是 Node ,然后它工作。
所以 java 会这样做,正确的答案是写:
reachableNodes = Graphs.reachableNodes(g, n);
绝对不需要在这里明确写出 N 的“值”。
我怎么强调 java 的惯用语意味着你不应该指定这些东西,除非没有其他办法。 但是,可以明确 state 每个类型变量应该是什么。 如果您使用它,则需要拼出该方法的每个类型变量。 语法是something.<typearg1, typearg2>methodName(params);
, this
您愿意,可以在需要存在某些东西的地方。 您的reachableNodes
方法有 1 个类型参数(即<N>
,它的第一次出现,声明它,rest 正在使用它),所以需要在那些<>
中有 1 件事,你有 2 件事,那就是为什么编译器说你的代码是错误的。 只是Graphs.<Node>reachableNodes(g, n)
完成了这项工作,但是<Node>
位是多余的。 编译器可以自己算出来,不需要你写出来。
如果我理解正确,您正在尝试使用您自己的 Graph 和 Node 类从 Guava 库中重新创建这些方法,在这种情况下,您只需要重用此方法声明并实现它,同时确保您正在导入您的 Graph 和节点类而不是库的。
public static <N> Set<N> reachableNodes(Graph<N> graph, N node) {
// your implementation...
}
这段代码
Set<Node> reachableNodes = new HashSet<>();
reachableNodes= Graphs.<Graph, Node>reachableNodes(g, n);
我不确定意图是否是这样,但无论如何它都是无效的。
Set<Node> Graphs.<Graph, Node> reachableNodes(g, n);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.