方法返回类型以实现多个接口

z00*_*0bs 18 java generics inheritance interface return-value

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

假设我们有以下接口:

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

interface Foo {
    void doFoo();
}

inteface Bar {
    void doBar();
}
Run Code Online (Sandbox Code Playgroud)

的实现者FooBar需要提供的方法getFooBar(),它返回一个fullfills类型的实例Foo以及Bar.

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

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

class SomeImplementor implements FooBar {
    private FooAndBarImpl fSomeField;

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

}
Run Code Online (Sandbox Code Playgroud)

鉴于这FooAndBarImpl是由框架或库提供的某种类型和实现Foo,Bar我认为这应该工作.但是,它没有,因为"FooAndBarImpl无法转换为T".这是为什么?getFooBar()我所看到的合同所隐含的合约并没有被打破.

另一种解决方案是定义一个扩展的新接口,Foo并将Bar其用作返回类型.我只是不明白在返回的一个空的包装太大意义fSomeFieldgetFooBar()实现.

编辑:

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

dav*_*vin 14

你可以使T成为一个类参数:

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

    public T getFooBar() {
        return fSomeField;
    }

}
Run Code Online (Sandbox Code Playgroud)

至于为什么你的泛型方法不起作用.让我们创建一个实现以下两个类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;
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我们现在应该能够执行以下操作:

SomeImplementor s = new SomeImplementor();
A a = s.getFooBar();
B b = s.getFooBar();
Run Code Online (Sandbox Code Playgroud)

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

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