【问题标题】:Java - understanding method signatureJava - 理解方法签名
【发布时间】:2018-04-30 09:20:03
【问题描述】:

应该向这个Java方法发送什么参数:

public void resume(Collection<TopicPartition> partitions)

更多详情here.

我可以看到&lt;TopicPartition&gt; 是一个带有这个签名的Java 类:
TopicPartition(String topic, int partition)
但是在那之后,在上面的Java 方法中有一个关键字partitions

那么是 3 个参数还是 2 个或 1 个参数?

请有人描述我应该如何阅读这种签名。

谢谢。

【问题讨论】:

  • 该方法需要一个参数,Collection&lt;TopicPartition&gt;
  • 谢谢。该单个参数看起来像一个包含 2 个参数的类 TopicPartition(String topic, int partition) 。那么期望发送 String 和 int 还是带有这两个值的集合(可能是地图)?
  • TopicPartition(String topic, int partition) 是一个构造函数,而不是一个。类没有签名,只有方法和构造函数有。

标签: java generics methods apache-kafka


【解决方案1】:

让我们一步一步来:

首先,当然只有一个名为“分区”的参数

 public void resume(Collection<TopicPartition> partitions)
  • public 是访问修饰符,这意味着该方法在任何地方都可见

  • void是返回类型,表示没有返回值

  • resume 是方法名称/标识符

Collection&lt;TopicPartition&gt; partitions 有点难以解释:

接口'Collection'后跟一个类型(TopicPartitions)意味着您可以将任何TopicPartition对象的集合输入到方法中。例如:

List<TopicPartition> list = new LinkedList<>();
resume(list);  // valid, sind List or more exact LinkedList are a Collection

Queue<TopicPartition> qq = new PriorityQueue<>();
resume(qq);  // valid, sind Que or more exact PriorityQueue are a Collection

语法Collection&lt;Type&gt; 是Java 泛型的一部分,您可以仔细查看this tutorial

您在这里所说的关键字(“分区”)是根本没有关键字,而只是该输入参数的名称/标识符。您必须为每个参数指定一个明确的名称 - 这样您就可以在方法代码中识别它。

在此示例中,您可以将“分区”重命名为您想要的任何名称,我会担保类似“partCollection”的名称

void、return、public、private、static、class, ...这些都是关键字。

第二,TopicPartition 和你这里引用的方法是TopicPartition 类的构造函数,它需要2 个参数:String topicint partition,而不仅仅是一个方法。

构造函数是实例化类时调用的方法(例如使用new 关键字创建对象)。

所以给你一个更详细的例子:

List<TopicPartition> list = new LinkedList<>();
list.add(new TopicPartition("part1", 1));
list.add(new TopicPartition("part2", 2));
resume(list);  
// resume has now been called with argument of a list (which is a collection) 
// containing two TopicPartition objects whit part1, part2 and 1,2 as 
// construction arguments

【讨论】:

  • 好答案。我建议的唯一补充是提及他所描述的适当术语。即“Java 泛型”。如果您添加一个链接到一些关于 Java 泛型更详细的解释,这也会很有帮助。
  • 谢谢两位。只是为了深入了解TopicPartition 片刻。我可以在这里 (kafka.apache.org/0101/javadoc/org/apache/kafka/common/…) 看到它应该是一个具有此签名 TopicPartition(String topic, int partition) 的类。所以基于这个事实 - 这是一个正确的数据结构List&lt;TopicPartition&gt; list = new LinkedList&lt;&gt;();
  • @Gewure 你可能知道 Scala 方法会是什么样子吗?也许是这样的:def kafkaResume(topicPart: scala.collection.immutable.List[TopicPartition]) = { consumer.resume(topicPart.asJava) }?如果是的话 - 有人会如何使用 Scala 调用这个方法? List 是正确的数据结构(在 Scala 中)还是 Map?谢谢。
  • @Joe 我不了解 scala(除了我知道 javas 泛型最初来自 scala),也没有 kafka - 但给你一个提示:方法 kafkaresume 采用不可变列表 作为参数 - 所以 List list = new ImmutableList();将是 Java 中的正确类型。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2017-07-25
相关资源
最近更新 更多