java - 通用方法我如何定义我的类类型?
问题描述
我想使用用泛型类型实现的番石榴库。现在在我的代码中我必须使用它们,但我不熟悉使用泛型方法。
这是来自 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> 对其进行参数化”。
你能帮我么?
提前致谢。
解决方案
类型变量
第一个声明它<N>
。public <N> Set<N> reachableNode
就像x
in void foo(int x)
:它决定它的存在,它没有定义它是什么,或者使用它。所有其他用法都在使用它。顾名思义,类型变量的“值”是一个类型(如int
、Object
或Map<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>
位是多余的。编译器可以自己算出来,不需要你写出来。
推荐阅读
- awk - 如何围绕每个部分的一个特定字母将数据拆分为 5 个字母
- javascript - 在node.js上发出http请求是否正常
- php - Symfony 升级到 Symfony 4.2 后出现“尝试加载类”错误
- php - WordPress 发布下一个和上一个链接
- python - Django queryset : Calculate monthly average
- python - Python argparse 通过命令行传递列表或字典
- r - subsetting a vector/data frame in R yields different results
- hazelcast - Hazelcast as Second level cache + distributed
- python - Synchronizing data from external source to db used in django project?
- fortran - Fortran中do循环的动态内存分配