【问题标题】:What is this Java generics notation before a method called? [duplicate]在调用方法之前,这个 Java 泛型符号是什么? [复制]
【发布时间】:2021-07-27 01:18:36
【问题描述】:

我遇到了一些我不熟悉的带有泛型符号的示例代码:

vertx.eventBus().<JsonObject>consumer("sensor.updates", message -> {
  JsonObject json = message.body();
  ...
});

注意调用 consumer() 之前的“”。

我理解它的作用,consumer() 采用泛型类型 T,我们告诉编译器在第二个参数中期望 JsonObject。来自EventBus.consumer 文档:

<T> MessageConsumer<T> consumer(String address, Handler<Message<T>> handler)

我想我只是在使用多年后看到不熟悉的泛型语法感到惊讶。是否有此符号的名称,或者我需要注意的任何非显而易见的行为?

【问题讨论】:

  • 这里的教程中提到了(我自己还在寻找一个确切的答案):docs.oracle.com/javase/tutorial/java/generics/methods.html
  • 啊,我想就是这样,它被称为type witness。当类型推断系统无法区分两个或多个泛型方法并且您必须指定您希望它使用哪一个。 docs.oracle.com/javase/tutorial/java/generics/…
  • 重复链接也有一个答案,它解释了类型见证在 Java 7 中更有用,但是到 Java 8 改进了类型推断系统,您几乎不再需要类型见证了。
  • 感谢@markspace。 Type Witness 正是我想要的。自从泛型存在之前我就一直在编写 Java,遇到一些让我说“这到底是什么东西?”的东西总是有点可怕/令人高兴。

标签: java generics


【解决方案1】:

泛型一般有两种,分别是

  1. 泛型类型
  2. 泛型方法

泛型类型

您可以在类或接口中使用类型参数。在 Types 中使用的泛型称为泛型类型。

public interface Container<T> {
    T first();
    T last();
    void add(T data);
    List<T> getAll();
}

public class MyContainer<T> implements Container<T> {
    // Implementations
}

泛型方法

类型参数也可以定义在方法中,称为泛型方法。您可以在所有方法中定义泛型,例如静态方法和实例方法。你问的问题是泛型方法。

public static <T> void printTwoTimes(T data) {
    // Codes
}  

通过在方法中获取类型参数,该方法可以获得类型抽象,并且可以以类型安全的方式与各种类型一起使用。

这是关于泛型方法的官方参考。

https://docs.oracle.com/javase/tutorial/extra/generics/methods.html

问候

【讨论】:

  • 不幸的是,这实际上并没有回答问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2020-04-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2016-10-10
相关资源
最近更新 更多