首页 > 解决方案 > 通用方法我如何定义我的类类型?

问题描述

我想使用用泛型类型实现的番石榴库。现在在我的代码中我必须使用它们,但我不熟悉使用泛型方法。

这是来自 API 的方法描述:

public static <N> Set<N> reachableNodes(Graph<N> graph, N node)

此方法返回可从图中的一个节点访问的一组节点。

在我的项目中,我将图形类作为“Graph”,将节点类作为“Node ”,我想用我的类替换该方法。我尝试过这样,但出现错误:

Set<Node> reachableNodes = new HashSet<>();
reachableNodes= Graphs.<Graph, Node>reachableNodes(g, n);

这里 g 是 Graph 类类型,n 是 Node 类型。

错误提示“Graphs 类型的泛型方法reachableNodes(Graph, N) 的类型参数数量不正确;不能使用参数<Graph, Node> 对其进行参数化”。

你能帮我么?

提前致谢。

标签: javagenericssyntax-error

解决方案


类型变量

第一个声明它<N>public <N> Set<N> reachableNode就像xin void foo(int x):它决定它的存在,它没有定义它是什么,或者使用它。所有其他用法都在使用它。顾名思义,类型变量的“值”是一个类型(如intObjectMap<List<? extends String>, ? super Number>),就像 的“值”int x是整数一样。

对于任何给定的方法调用,类型变量都是“设置”的。所以,每当你调用这个方法时,N就是这样。每次调用都会设置它,就像方法如何void foo(int x)获取自己的 x 一样。foo(5)? 那么 x 是 5。foo(10)? 那么 x 是 10。

推理

通常,java 会尝试自动找出适合给定类型变量的值。需要有一些围绕您的调用的上下文(参数,或您如何使用它,或两者兼而有之),以便 java 执行此操作。在这种情况下,有足够的支持:该reachableNodes方法返回 a Set<N>,并且您将调用它的结果分配给类型为 的变量Set<Node>:Java 足够聪明,可以确定如果我们 go: N = Node,它就会“工作”。相同的规则可能适用于您对变量n(毫无疑问是 Node 类型)以及g(可能是类型Graph<Node>.

所以java会这样做,正确的答案是写:

reachableNodes = Graphs.reachableNodes(g, n);

绝对不需要在这里明确写出 N 的“值”。

手动指定类型变量

我怎么强调惯用的 java 意味着你不应该指定这些东西,除非没有其他方法。但是,可以明确说明每个类型变量应该是什么。如果您使用它,则需要拼出该方法的每个类型变量。语法是something.<typearg1, typearg2>methodName(params);,如果需要,可以在需要出现的地方出现this。您的reachableNodes方法有 1 个类型参数(即<N>,它的第一次出现,声明它,其余的都在使用它),所以 1 东西需要在那些<>,你有 2 东西,这就是编译器说你的代码的原因是错误的。只是Graphs.<Node>reachableNodes(g, n)做这项工作,但是,<Node>位是多余的。编译器可以自己算出来,不需要你写出来。


推荐阅读