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可能是什么.
归档时间: |
|
查看次数: |
30337 次 |
最近记录: |