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其用作返回类型.我只是不明白在返回的一个空的包装太大意义fSomeField的getFooBar()实现.
编辑:
如果有人能解释为什么泛型方法不起作用,我将不胜感激.我只是没有看到它.
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)
至于为什么你的泛型方法不起作用.让我们创建一个实现以下两个类Foo和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;
}
}
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.
| 归档时间: |
|
| 查看次数: |
5946 次 |
| 最近记录: |