2010-12-21 79 views
4

比方说,我有2个接口,A和B:Java接口的问题

public interface A { 
List<B> getBs(); 
} 

public interface B { 
} 

和2类实现这些接口:

public class AImpl implements A { 

public List<B> getBs() { 
    return null; 
} 

} 


public class BImpl implements B { 
} 

莫非可能的(也许使用泛型),我消气方法返回一个BImpl类型对象的列表,如:

public class AImpl implements A { 

public List<BImpl> getBs() { 
    return null; 
} 

} 

谢谢

回答

6

我想你会需要改变接口声明此:

public interface A { 
List<? extends B> getBs(); 
} 

然而,如果你希望客户端知道你使用哪种实现类型,事情会变得更复杂:

public interface A<C extends B> { 
    List<C> getBs(); 
} 

public class AImpl implements A<Bimpl>{ 
    public List<Bimpl> getBs(); 
} 
+0

本编译:公共接口A 。 – 2010-12-22 03:48:15

3

只有你可以改变A.getBs()方法的定义:

List<? extends B> getBs(); 
3

不,因为泛型t ypes不是协变的。

List<BImpl>不是List<B>的子类。

接口A中方法的部分合同是返回List<B>

public interface A { 
List<B> getBs(); 
} 

A List<BImpl>不支持该合同。例如,期望List<B>的收件人可能会尝试添加其他类型的B的实例 - 例如BImpl2BImpl3

A List<B>只包含BImpl将支持合同。