【问题标题】:How to return a concrete type when implementing a generic interface实现泛型接口时如何返回具体类型
【发布时间】:2013-05-23 04:41:58
【问题描述】:

我有一个接口,它将由几个不同的类实现,每个类使用不同的类型和返回类型。返回类型可以从方法泛型类型中推断出来,但我在实现这一点时遇到了麻烦。

目前界面是这样的:

public interface TransformUtilsBase<T> {

    Class<?> transformToNhin(T request, BrokerContext brokerContext);
}

我希望 Impl 类看起来像:

public class TransformUtilsXCPD implements TransformUtilsBase<foo> {

    bar transformToNhin(foo request, BrokerContext brokerContext) {
        code here
    }

在 impl 我知道返回类型应该是什么。在接口层面没有办法说出来。

我可以完全放弃一个接口,只创建几个具有相同方法名称的类,但我想将其形式化,因为它们都用于相同的目的。只是类型不同。

或者我可以只拥有一大类静态方法,因为它们是 util 操作,但是管理一个具有这么多同名方法的类以及所有必要的辅助方法(同样都具有相同的名称)。

实现接口似乎是形式化功能的最佳选择,即使我无法使用静态方法。我只是不知道如何处理返回类型。

编辑:扩展界面以显示完整示例,以防止进一步混淆。 接口

public interface TransformUtilsBase<T, U> {
    Class<?> transformToNhin(T request, BrokerContext brokerContext);
    Class<?> transformToXca(U request, BrokerContext brokerContext);
}

实施

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, Bar> {
    Baz transformToNhin(Foo request, BrokerContext brokerContext) { code here }
    Biz transformToXca(Bar request, BrokerContext brokerContext) { code here }
}

【问题讨论】:

  • 您是要返回实际的 Baz 类还是 Baz 的实例?您的编辑意味着它可能是第二个。
  • 好点。我正在尝试返回在转换过程中创建的 Baz 类的特定实例。通配符表示法是我所知道的最好的方式来表达我想要的意图,即仅为方法变量提供泛型,返回类型可以由它来确定。

标签: java generics interface


【解决方案1】:

你为什么不也声明返回类型的类型,像这样

public interface TransformUtilsBase<T, S> {

    S transformToNhin(T request, BrokerContext brokerContext);
}

您甚至可以将您的返回类型“绑定”为特定类型(比如Bar

public interface TransformUtilsBase<T, S extends Bar> {

    S transformToNhin(T request, BrokerContext brokerContext);
}

实现的类将声明为

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, BarImpl> {

    BarImpl transformToNhin(Foo request, BrokerContext brokerContext) {
        //code here
    }
}

其中BarImplBar 的子类

【讨论】:

  • Nitpick:S extends Class 部分在最后一个示例中没有真正意义,因为Bar 肯定不能扩展Class。我会使用Class 之外的其他内容作为上限示例 - 我认为 OP 在他写的时候很困惑。
  • 感谢@PaulBellora,我已经删除了Class 作为上限并给出了一些其他示例
  • 我应该道歉。我已经提交了一个缩短版本的界面/实现,试图更简洁,但我没有。我曾想过这个选项,但它看起来很笨拙,因为我有 4 种泛型类型。我将创建一个编辑以显示完整版本。如果这仍然是最好的方法,那么我将使用它并将您的答案标记为正确。非常感谢您的洞察力。
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2013-06-14
  • 1970-01-01
相关资源
最近更新 更多