是否可以指定一个返回实现两个或多个接口的对象的方法?
假设我们有以下接口:
interface FooBar {
[Foo] & [Bar] getFooBar();
}
interface Foo {
void doFoo();
}
inteface Bar {
void doBar();
}
的实施者FooBar
需要提供方法getFooBar()
返回一个类型的实例,该类型满足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;
}
}
鉴于FooAndBarImpl
是框架或库提供的某种类型并实现Foo
and Bar
我认为这应该有效。然而,事实并非如此,因为“FooAndBarImpl 无法转换为 T”。这是为什么?所暗示的合同getFooBar()
正如我所见,并没有破损。
另一个解决方案是定义一个新的接口来扩展Foo
and Bar
并将其用作返回类型。我只是觉得返回一个空包装纸没有多大意义fSomeField
in the getFooBar()
执行。
EDIT:
如果有人能解释为什么泛型方法不起作用,我将不胜感激。我就是没看到。
您可以将 T 设为类参数:
class SomeImplementor<T extends Foo & Bar> implements FooBar {
private T fSomeField;
public T getFooBar() {
return fSomeField;
}
}
至于为什么你的泛型方法不起作用。让我们创建以下两个类来实现Foo
and Bar
:
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();
虽然getFooBar()
返回类型 A 的对象,该对象没有有效转换为类型 B(其中String
成员来自哪里?),即使 B 满足以下要求<T extends Foo & Bar>
,即是一个有效的T
.
简而言之,编译器(记住,泛型是编译时机制)不能保证每个T
类型的<T extends Foo & Bar>
可以对其进行赋值类型A
。这正是您看到的错误 - 编译器无法将给定的 A 转换为每个有效的 T。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)