考虑我有以下界面:
public interface A { public void b(); }
但是我希望实现它的每个类对方法b()都有不同的返回类型。
示例:
public class C {
public C b() {}
}
public class D {
public D b() {}
}
我如何定义我的界面以便这可能?
答案 0 :(得分:48)
如果返回类型必须是实现接口的类的类型,那么您想要的是F-bounded type:
public interface A<T extends A<T>>{ public T b(); }
public class C implements A<C>{
public C b() { ... }
}
public class D implements A<D>{
public D b() { ... }
}
简而言之,A
声明了一个类型参数T
,它将采用实现A
的每个具体类型的值。这通常用于声明类型良好的clone()
或copy()
方法。另一个例子是java.lang.Enum
使用它来声明每个枚举的继承compareTo(E)
方法仅适用于该特定类型的其他枚举。
如果您经常使用此模式,则会遇到需要this
为T
类型的情况。乍一看,似乎很明显它是 1 ,但实际上你需要声明一个abstract T getThis()
方法,实现者必须将其简单地实现为return this
。
[1]正如评论者指出的那样,如果X implements A<Y>
和X
正确合作,可能会像Y
那样偷偷摸摸地做些事情。 T getThis()
方法的存在使X
更明确地规避了A
接口作者的意图。
答案 1 :(得分:37)
泛型。
public interface A<E>{
public E b();
}
public class C implements A<C>{
public C b(){
return new C();
}
}
public class D implements A<D>{
public D b(){
return new D();
}
}
搜索泛型以获取更多详细信息,但(非常)基本上,正在发生的事情是A
将E
的类型留给实施条款(C
和{{1} })。
所以基本上A不知道(也不必知道)在任何给定的实现中E可能是什么。
答案 2 :(得分:2)
自Java supports covariant return types(自Java 1.5起)以来,您可以这样做:
public interface A { public Object b(); }