【问题标题】:Method level generic return types in interfaces接口中的方法级泛型返回类型
【发布时间】:2016-01-05 21:02:32
【问题描述】:

接口(用于返回类型)中的方法级泛型是否有意义?它们有什么用吗?示例:-

public interface ABX { 
    public <T> T fx(String p);
}

我可以像这样简单地制作通用类级别

public interface ABX<T> { 
    public T fx(String p);
}

在任何情况下我都希望泛型在接口/抽象类中是方法级别的(对于返回类型)。

【问题讨论】:

  • 您给出的示例基本上在任何地方都没有用,除了作为一个杂物,因为方法内部没有返回类型的上下文。这样的方法只能返回null才能通过静态类型检查。
  • @Radiodef 但第一个接口的实现可以定义具体的返回类型。
  • 不,他们不能。在方法上声明类型参数会使方法本身具有多态性。调用方法的代码是定义类型的地方,而不是实现。
  • 这实际上并不安全。 ideone.com/U2cCDK 编译器已经给你一个警告。以这种方式覆盖不是参数化方法,它利用了覆盖与擦除一起工作的方式。 (您始终可以用非泛型方法覆盖泛型方法,这允许向后兼容,但会绕过泛型的类型检查功能。)
  • 这是另一个 sn-p,它以更清晰的方式解释了它是如何工作的。 ideone.com/ofQVOc 我们可以用擦除来覆盖泛型方法,以便 Java 的非泛型版本可以扩展泛型类。 (不要问我为什么在他们提出这个问题时认为这很重要。我个人认为这比任何事情都更令人困惑。)

标签: java generics interface


【解决方案1】:

方法级别的泛型确实有实用性。但是您必须以某种方式绑定泛型类型参数,因此通常此类方法将具有泛型参数,如 Class,然后返回泛型值。您的示例没有这样做,因此很难看到泛型类型参数的值。

你可以到处看到它们的例子——我遇到最多的是杰克逊数据绑定类 ObjectMapper——https://fasterxml.github.io/jackson-databind/javadoc/2.2.0/com/fasterxml/jackson/databind/ObjectMapper.html,比如

<T> T readValue(InputStream is, Class<T> returnType)

所以,这里的值是 ObjectMapper 不是一个通用类型的类,但它允许我绑定 any 类(前提是它可以理解该类以及如何设置它基于输入的各种属性)。重要的一点是,整个应用程序只需要一个 ObjectMapper 实例,不需要为可能需要数据绑定的每种类型的对象创建一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2020-09-04
    • 2016-12-24
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多