如何在实现泛型接口时返回具体类型

12

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

目前该接口如下所示:

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
    }

在具体实现中,我知道返回类型应该是什么。但在接口层面上,无法确定返回类型。
我本可以完全放弃使用接口,只需创建几个类,所有类都具有相同的方法名称,但由于它们都用于相同的目的,因此我希望将其规范化。只有类型不同。
或者我可以只有一个带有静态方法的大类,因为它们是实用操作,但管理具有许多相同名称的方法和所有必要的辅助方法(同样具有相同名称)的类变得难以控制。
实现接口似乎是规范功能的最佳选择,即使我不能使用静态方法。我只是无法想出如何处理返回类型。
编辑:扩展接口以显示完整示例,以防止进一步混淆。
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类的一个实例?你的编辑暗示可能是后者。 - Alex
好的观点。我正在尝试返回在转换过程中创建的Baz类的特定实例。通配符符号是我所知道的传达我的意图的最佳方式,即仅为方法变量提供泛型,而返回类型可以确定。 - Zach Melnick
1个回答

14
为什么不把返回类型也声明为类型呢?就像这样:
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的子类。


挑剔一下:在最后一个例子中,“S extends Class”这部分并不是很合理,因为“Bar”肯定不能扩展“Class”。我会使用除“Class”以外的其他东西作为上限的示例 - 我认为原帖作者在写这个时有些困惑。 - Paul Bellora
感谢 @PaulBellora,我已将 Class 作为上界删除,并给出了其他一些示例。 - sanbhat
我应该道歉。我提交了一个缩短版接口/实现,试图更加简洁,但事实并非如此。我曾考虑过这种选项,但它似乎很难处理,因为我需要4个通用类型。我将创建一个编辑来显示完整版本。如果这仍然是最佳方法,那么我将使用它并将您的答案标记为正确。非常感谢您的见解。 - Zach Melnick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接