繁体   English   中英

通用方法 如何用我的 class 类型定义?

[英]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 :它决定它的存在,它没有定义它是什么,或者使用它。 所有其他用法都在使用它。 顾名思义,类型变量的“值”是一个类型(如intObjectMap<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);
  1. 实例化分配给reachableNodes 的新HashSet<Node>
  2. 将reachableNodes 重新分配给无效的方法声明?

我不确定意图是否是这样,但无论如何它都是无效的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM