用于实现多个接口的方法返回类型

是否可以指定一个方法,该方法返回实现两个或多个接口的对象?

假设我们有以下接口:

interface FooBar {
    [Foo] & [Bar] getFooBar();
}

interface Foo {
    void doFoo();
}

inteface Bar {
    void doBar();
}

需要提供方法的实现者,该方法返回一个完全填充的类型实例以及 。FooBargetFooBar()FooBar

到目前为止,我尝试的是使用泛型来做:

interface FooBar {
    <T extends Foo & Bar> T getFooBar()
}

class SomeImplementor implements FooBar {
    private FooAndBarImpl fSomeField;

    public <T extends Foo & Bar> T getFooBar() {
        return fSomeField;
    }

}

鉴于这是框架或库和实现提供的某种类型,我认为这应该有效。但是,它没有,因为“FooAndBarImpl不能转换为T”。为什么?在我看来,所暗示的合同并没有被打破。FooAndBarImplFooBargetFooBar()

另一种解决方案是定义一个扩展的新接口,并将其用作返回类型。我只是认为在实现中返回一个空的包装器没有多大意义。FooBarfSomeFieldgetFooBar()

编辑:

如果有人能解释为什么泛型方法不起作用,将不胜感激。我只是没有看到它。


答案 1

您可以将 T 设为类参数:

class SomeImplementor<T extends Foo & Bar> implements FooBar {
    private T fSomeField;

    public T getFooBar() {
        return fSomeField;
    }

}

至于为什么你的泛型方法不起作用。让我们创建以下两个类,它们实现 和 :FooBar

class A implements Bar, Foo{
   private int a;
   ...
}
class B implements Bar, Foo{
   private String b;
   ...
}
class SomeImplementor implements FooBar {
   private A someField;
   public <T extends Foo & Bar> T getFooBar() {
      return someField;
   }
}

因此,我们现在应该能够执行以下内容:

SomeImplementor s = new SomeImplementor();
A a = s.getFooBar();
B b = s.getFooBar();

尽管返回类型 A 的对象,该对象没有对类型 B 的有效强制转换(成员将来自哪里?),即使 B 满足 的要求,即是有效的 。getFooBar()String<T extends Foo & Bar>T

简而言之,编译器(请记住,泛型是一种编译时机制)不能保证每个类型都可以为其分配类型。这正是您看到的错误 - 编译器无法将给定的A转换为每个有效的T。T<T extends Foo & Bar>A


答案 2

另一种解决方案是定义一个扩展 Foo 和 Bar 的新接口,并将其用作返回类型。

我会说选择这个选项。


推荐