Jon*_*han 33 java generics types return interface
考虑我有以下界面:
public interface A { public void b(); }
Run Code Online (Sandbox Code Playgroud)
但是我希望实现它的每个类都有一个不同的方法b()的返回类型.
例子:
public class C {
public C b() {}
}
public class D {
public D b() {}
}
Run Code Online (Sandbox Code Playgroud)
我如何定义我的界面以便这可能?
Mat*_*nry 49
如果返回类型必须是实现接口的类的类型,那么您想要的是F-bounded类型:
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() { ... }
}
Run Code Online (Sandbox Code Playgroud)
换句话说,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界面作者的意图.
Cam*_*Cam 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();
}
}
Run Code Online (Sandbox Code Playgroud)
搜索泛型以获取更多详细信息,但(非常)基本上,正在发生的事情是A叶子E的类型直到执行条款(C和D).
所以基本上A不知道(也不必知道)在任何给定的实现中E可能是什么.